c ++ как вернуть объект текущего типа классов (наследование) - PullRequest
0 голосов
/ 05 марта 2012

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

class A{
public:
    A(int i);

    static A* createWithSpecialCalculation(int a, int b, int c){
      // ...complex calculation here...
      return new A(result_of_calculation);
    }
};

class B:A{
public:
    float m_additionalMember;
};

теперь я хочу иметь возможность звонить

B* myB = B::createWithSpecialCalculation(1,2,3);

Возможно ли это как-нибудь? если да, то как?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Как насчет:
Просто немного измените определение createWithSpecialCalculation в A.

template<typename T>
static T* createWithSpecialCalculation(int a, int b, int c){
  // ...complex calculation here...
  return new T(result_of_calculation);
}

Тогда вы можете пойти:

B* myB = A::createWithSpecialCalculation<B>(1,2,3);
0 голосов
/ 05 марта 2012

Наследование здесь может не подходить.

Вместо этого рассмотрим бесплатную функцию шаблона:

template <typename T>
T* createOne(int a, int b, int c) {
   int x = complexCalculation(a,b,c);
   return new T(x);
}

То есть, если аргумент (ы) для конструктора будет одинаковым независимо от типа A или B; из вашего желания избежать любого дублирования кода, похоже, что это уже полезно.

A* myA = createOne<A>(1,2,3);
B* myB = createOne<B>(1,2,3);

Рассмотрим shared_ptr<>, а не эти необработанные указатели.

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