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

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

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

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

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

#include <iostream>
#include <string>

class model;

class view {
public:
  view( model *m ) {}
  virtual std::string display() {
    return "view";
  }
};

#define RELATED_CLASS(RELATED)\
typedef RELATED relatedType;\
virtual relatedType*createRelated(){\
return new relatedType(this);}

class model {
public:
  RELATED_CLASS(view)
  model() {}
};

class otherView : public view {
public:
  otherView( model *m ) : view(m) {}
  std::string display() {
    return "otherView";
  }
};

class otherModel : public model {
public:
  RELATED_CLASS(otherView)
  otherModel() {}
};

class control {
public:
  control( model *m ) : m_(m),
      v_( m->createRelated() ) {}
  ~control() { delete v_; }
  std::string display() {
    return v_->display();
  }
  model *m_;
  view  *v_;
};

int main( void ) {
  model m;
  otherModel om;

  model *pm = &om;

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

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

Ответы [ 2 ]

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

Вы пытаетесь реализовать свой собственный RTTI.
Однако вместо этого вы можете использовать встроенный в C ++ RTTI typeid .

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

Вместо этого вы можете использовать шаблоны, чтобы избежать #defines, но в любом случае обратите внимание, что вы по сути перегружаете тип возвращаемого значения с помощью метода createRelated от другой модели.

Вероятно, есть лучший способ сделать то, что вы пытаетесь сделать.

#include <iostream>
#include <string>

class model;

class view {
public:
  view( model *m ) {}
  virtual std::string display() {
    return "view";
  }
};

class model {
public:
  virtual view* createRelated() {  return new view (this); }
  model() {}
};


template <class Related>
class relatedModel : public model
{
  public:
    relatedModel() : model() {}
    virtual view* createRelated() { return new Related(this);}
} ;


class otherView : public view {
public:
  otherView( model *m ) : view(m) {}
  std::string display() {
    return "otherView";
  }
};

class control {
public:
  control( model *m ) : m_(m),
      v_( m->createRelated() ) {}
  ~control() { delete v_; }
  std::string display() {
    return v_->display();
  }
  model *m_;
  view  *v_;
};

int main( void ) {
  relatedModel<view> m;
  relatedModel<otherView> om;

  model *pm = &om;

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

  std::cout << c1.display() << std::endl;
  std::cout << c2.display() << std::endl;
  std::cout << c3.display() << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...