Как я могу создавать связанные типы динамически? - PullRequest
0 голосов
/ 22 ноября 2011

Как определить тип класса, который динамически связан с другим классом?

Я нашел решение, единственная проблема в том, что мне пришлось использоватьопределение, которое должно использоваться во всех производных классах.

Есть ли более простой способ сделать это, не требуя поддержки для добавленного класса?

Важно отметить: и класс, и связанный класс всегда будут иметь свой соответствующий базовый класс, разные классы могут совместно использовать связанный класс, и, как в примере, я бы хотел, чтобы класс управления владел видом

Это то, что у меня есть сейчас.Единственное, что мне нужно, - это переключение, но я бы хотел, чтобы он был, поэтому мне нужно только добавить код, чтобы вернуться и изменить его.

#include <iostream>
#include <string>

class model 
{
public:
  model( int id ) : id(id) {}

  int id;
};

class view 
{
public:
  view( model *m ) {}

  virtual std::string display() 
  {
     return "view";
  }
};

class otherView : public view 
{
public:
  otherView( model *m ) : view(m) {}

  std::string display() 
  {
     return "otherView";
  }
};


class control 
{
public:
  control( model *m ) : m_(m), v_( createRelated() ) {}

  ~control() 
  { 
     delete v_; 
  }
  std::string display() 
  {
     if ( v_ )
        return v_->display();
     return "No view";
  }

  view *createRelated() 
  {
     switch( m_->id )  
     {
     case 0:
       return new view( m_ );
     case 1:
       return new otherView( m_ );
     default:
       return NULL;
     }
  }

  model *m_;
  view  *v_;
};

int main( void ) {
  model m(0);
  model om(1);
  model nm(2);

  control c1( &m );
  control c2( &om );
  control c3( &nm );

  std::cout << c1.display() << std::endl;
  std::cout << c2.display() << std::endl;
  std::cout << c3.display() << std::endl;
}

Ответы [ 4 ]

1 голос
/ 23 ноября 2011

Возможное решение - изменить модель так, чтобы она принимала указатель на функцию, которая создает связанный класс, вместо передачи идентификатора:

typedef view* (*make_function)(model*);

class model
{
public:
    model(make_function a_make) : make_(a_make) {}
    view* make() const { return make_(this); }
...
private:
    make_function make_;
};

Каждый из view классов предоставляет статический метод, который создает собственный экземпляр:

class view
{
public:
    static view* make(model* m) {  return new view(m); }
};

class otherView: public view
{
public:
    static view* make(model* m) {  return new otherView(m); }
};

Тогда createRelated () станет:

view* control::createRelated()
{
    return m_->make();
}

Пример использования:

model m1(&view::make);
model m2(&otherView::make);

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

0 голосов
/ 17 октября 2013

Вы в основном ищете технику под названием Виртуальный конструктор .

0 голосов
/ 22 ноября 2011

Вам могут понадобиться некоторые виртуальные функции.Даже если вы передадите объект типа B, производный от типа A:

void f(A &objA) {
  objA.f();
}

int main() {
  B objB;
  f(objB);
  return 0;
}

, если A :: f () определен как виртуальный, будет вызван B :: f ().Так что вам не нужно знать, что objA был objB.

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