класс, содержащий универсальный тип потомка - PullRequest
0 голосов
/ 22 октября 2010

Существует ли какой-либо возможный способ использования универсального типа для содержания дочернего элемента базового класса.

Из данного мне поручения я должен создать нечто похожее на следующее по структуре.

template <class T>
class Fruit {
  private:
    int count;
    int location_id;
    T type;
  public:
    virtual void displayInfo();
};

class Apple : private Fruit<Apple> {
  private:
    int variety;
  public:
    void displayInfo() {
        printf("Location %i has %i of %s in stock", location_id, count, variety);
    }
};

Fruit<Apple> appleinventory[SIZE];

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

Обновление: Я полагаю, что для назначения мы должны использовать наследование, чтобы показать использование виртуальных функций. Я обновил код выше. Я думаю, что это будет работать, но НЕ нуждается в шаблонах для успеха. Мы не рассмотрели какие-либо дополнительные избыточные методы наследования в классе.

Ответы [ 2 ]

0 голосов
/ 22 октября 2010

Это прекрасно, в принципе.

Подробнее о шаблоне любопытно повторяющихся шаблонов (CRTP) для получения дополнительной информации об использовании производного класса в качестве экземпляра типа в шаблоне класса, который является его основой, особенно пример статического полиморфизма, который должен выглядеть ' с любопытством 'знакомый.

template <class Derived> struct Base
{
    void interface()
    {
        // ...
        static_cast<Derived*>(this)->implementation();
        // ...
    }

    static void static_func()
    {
        // ...
        Derived::static_sub_func();
        // ...
    }
};

struct Derived : Base<Derived>
{
    void implementation();
    static void static_sub_func();
};
0 голосов
/ 22 октября 2010

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

template <class T> class Fruit 
{
private:
    int count;
    int location_id;
    T* type;
};

class Apple : private Fruit<Apple> 
{
private:
    int seeds;
    bool red;
};

Fruit<Apple> appleinventory[SIZE];

Обратите внимание, что тип T * теперь является указателем на Apple, а неэкземпляр Apple.

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