Как преобразовать унаследованные классы C с функциями в стиль C?

#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:

Вы пытаетесь взвалить на себя слишком много задач одновременно. Я предлагаю добавлять функциональность шаг за шагом.

Иметь дело только с одним классом

  1. Поддержка эквивалента простого класса, класса, содержащего только переменные-члены, но без функций-членов.
  2. Поддержка эквивалента класса с невиртуальными функциями-членами.
  3. Поддержка эквивалента класса с невиртуальными функциями-членами, а также с виртуальными функциями-членами.

Разберитесь с базовым классом и производным классом

  1. Поддержка эквивалента простого производного класса только с переменными-членами и без каких-либо функций-членов, ни в базовом классе, ни в производном классе.
  2. Поддерживайте эквивалент производного класса с невиртуальными функциями-членами только базового класса.
  3. Поддерживайте эквивалент производного класса с невиртуальными функциями-членами как в базовом классе, так и в производном классе.
  4. Поддерживайте эквивалентную сеть производного класса с виртуальными функциями-членами только в базовом классе, а также с невиртуальными функциями-членами.
  5. Поддержка эквивалента производного класса с виртуальными функциями-членами, а также невиртуальных функций-членов в базовом классе и производном классе.

Не пытайтесь работать над задачей, если вы не выполнили все предыдущие в приведенном выше списке.

Надеюсь, это поможет.