Указатели на базовые классы и как определить фактический тип экземпляра - PullRequest
1 голос
/ 03 декабря 2011

У меня есть проблема, и я не уверен, как подойти к ней в C ++;

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

Как бы я смоделировал это в C ++?

Я хотел бы иметь классы A, B, C, AddOn1, AddOn2.

Проблема:

Как AddOn1 / 2 узнает во время выполнения, какие действия он содержит (другими словами, как он узнает, к какому (типу) объекту он присоединен)?

Как класс A, B, C узнает, какой тип надстройки у него есть?

Я хотел бы сделать что-то вроде

класс А { ... AddOn * addOn; };

И используйте этот указатель для работы с надстройкой. Но мне нужно привести его в определенный класс, чтобы иметь возможность использовать его функции.

Я вижу, как я могу иметь логические поля, такие как hasAddOn1 и hasAddOn2, и приводить их на основе этих настроек. Затем в базовом классе AddOn я мог бы иметь указатель на его родителя и опрашивать родителя, чтобы узнать тип AddOn.

Имеет ли это смысл?

1 Ответ

2 голосов
/ 03 декабря 2011

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

Почему бы не использовать наследование и шаблоны?

struct A {
  virtual void action_foo(); // virtual not really needed in this example
};

struct B {
  virtual void action_bar();
};

template<class base_t>
struct AddOn1 : base_t {
  virtual void action_baz();
};

void func(A& a) {
  a->action_foo();
}

// example of use

A x;
B y;
AddOn1<A> z; // add on to A
x.action_foo();
y.action_bar();
z.action_baz();
func(x);
func(z);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...