C ++ Относительная иерархия наследования - PullRequest
1 голос
/ 26 сентября 2010

Существует код C, который мы пытаемся преобразовать в код C ++. Существовали две иерархии наследования, которыми C управлял через switch..case. Это было преобразовано для использования виртуальных функций в C ++. Теперь в какой-то момент эти две иерархии должны быть связаны. Например, класс A относится к A1, класс B относится к B1 .... где A, B, C попадают в иерархию1, а A1, B1, C1 попадают в иерархию2. В коде C это достигается сохранением поля тега (или поля типа, используемого в switch..case) иерархии 2 в A, B, C. Может ли кто-нибудь подсказать мне, как достичь этого C ++ чисто?

В С

enum NodeTag1
{
  A_Node
  , B_Node
  ....  
};

enum NodeTag2
{
   A1_Node
   , B1_Node
   ....
};

struct Node
{
   NodeTag1 tag1;
};

struct A
{
     NodeTag1 tag1;
     NodeTag2 tag2;
     ..other members...
};

struct B, C выглядят одинаково.

Теперь предположим, что есть 10 функций (f1, f2 ..), которые используют NodeTag1 для переключения .. case В С ++

class Node {  //10 virtual functions (f1,f2 ..)};
class A : public Node { // 10 virtual function( f1, f2.. ) };
class B : public Node { // 10 virtual function( f1, f2.. ) };

Теперь есть такая функция, которая вызывается из экземпляров иерархии 1.

int decide( NodeTag2 tag2 )
{
   switch(tag2)
   {
      ...
   }
}

Как мне добиться этого в C ++?

Спасибо, Gokul.

Ответы [ 2 ]

1 голос
/ 26 сентября 2010

Если вы не хотите создавать объекты во время выполнения. Вы можете использовать следующий метод. только с одним созданием объекта времени. Поскольку вам не нужен доступ к членам классов, ваш объект будет выполнять один объект;

class A
{

public:

 virtual f()
 {
  printf("A");
 }

 static A* behaveLikeA();

 static A* behaveLikeB();
};

class B : public A
{

public:

 virtual f()
 {
  printf("B");
 }
};

A* A::behaveLikeA()
{
 static A ag;
 return &ag;
}

A* A::behaveLikeB()
{
 static B bg;
 return &bg;
};


int main(int argc, char* argv[])
{

 A* b = A::behaveLikeB();
 b->f();

 b = A::behaveLikeA();
 b->f();
 return 0;
}
1 голос
/ 26 сентября 2010

Если под «относиться» вы подразумеваете создание общего метода, то фабричный метод .Это виртуальная функция в классах A, B и C, которая возвращает объект A1, B1 или C1, соответственно.

class A  
{
  virtual A1 GetRelated() { return new A1(); };
}

class B: public A
{
  A1 GetRelated() { return new B1(); };
}

class A1;
class B1: public A1;
..

Это, конечно, предполагает, что классы A и A1 являются родителями классов B и B1,ваша иерархия может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...