#c #c
#c #c
Вопрос:
Меня попросили изменить следующий C
код на C
. Я почти уверен, что C
классы могут быть преобразованы в структуры C. Но что происходит, когда эти классы являются унаследованными классами и содержат некоторые функции? Должен ли я использовать указатели на функции? А что, если эти функции принадлежат родительскому классу?
class A {
protected:
int x;
public:
A():x(0){}
virtual void Method1()const {}
virtual void Method2(){}
void Method3()const {}
virtual ~A() {}
};
class B : public A {
public:
virtual void Method1() {}
virtual void Method4() const {}
virtual ~B(){}
};
void main(){
B* b;
b = new B;
b->Method1();
b->Method2();
b->Method3();
b->Method4();
}
Вот мое частичное решение (только для «основной» части). Я предположил, что функции «Методы» являются указателями на функции внутри структур a и b. Это нормально?
void main(){
B* b;
A* a;
b = (B*)malloc(sizeof(B));
a = (A*)malloc(sizeof(A));
if ((b==NULL)||(a==NULL)) // memory alloc. check
return;
b->Method1=Method1_t;
b->Method2=Method2_t(a);
b->Method3=Method3_t(a);
b->Method4=Method4_t;
// MethodX_t are written as functions outside structs, main.
}
Комментарии:
1. Код, опубликованный для решения на C, является неполным, поэтому на этот вопрос невозможно ответить. Итак, опубликуйте полный код.
2. Обратитесь по этой ссылке. Вы получите некоторое представление forums.devshed.com/programming-42 /…
3. Код не имеет видимых эффектов (нет выходных данных, нет внешнего воздействия), поэтому простой перевод был бы
int main() {return 0;}
. Это будет работать в любой версии C — в C99 и более поздних,return
оператор может быть опущен. Помимо этого, преобразование отношений наследования и функций-членов, виртуальных или нет, в C является важной задачей, поскольку некоторые аспекты (перегрузка функций, скрытие функций — оба из которых вы используете) требуют много работы для реализации в C. Практически было бы проще начать с дизайна и реализовать его на C, чем пытаться перепроектировать C-код из C -кода.
Ответ №1:
Вы пытаетесь взвалить на себя слишком много задач одновременно. Я предлагаю добавлять функциональность шаг за шагом.
Иметь дело только с одним классом
- Поддержка эквивалента простого класса, класса, содержащего только переменные-члены, но без функций-членов.
- Поддержка эквивалента класса с невиртуальными функциями-членами.
- Поддержка эквивалента класса с невиртуальными функциями-членами, а также с виртуальными функциями-членами.
Разберитесь с базовым классом и производным классом
- Поддержка эквивалента простого производного класса только с переменными-членами и без каких-либо функций-членов, ни в базовом классе, ни в производном классе.
- Поддерживайте эквивалент производного класса с невиртуальными функциями-членами только базового класса.
- Поддерживайте эквивалент производного класса с невиртуальными функциями-членами как в базовом классе, так и в производном классе.
- Поддерживайте эквивалентную сеть производного класса с виртуальными функциями-членами только в базовом классе, а также с невиртуальными функциями-членами.
- Поддержка эквивалента производного класса с виртуальными функциями-членами, а также невиртуальных функций-членов в базовом классе и производном классе.
Не пытайтесь работать над задачей, если вы не выполнили все предыдущие в приведенном выше списке.
Надеюсь, это поможет.