C ++ typedef в классе - PullRequest
       19

C ++ typedef в классе

1 голос
/ 04 марта 2011

Я использую этот код C ++ для хранения x в переменной val.

class Hello
{
  int val;
public:
  Hello(int x) : val(x) {}
};

Однако, когда я увидел этот код, я не вижу, как Super может хранить значения t или o.

template<typename T>
class K : public std::auto_ptr<T>
{
    typedef std::auto_ptr<T> Super;
public:
    K() : Super() { }
    K(T* t) : Super(t) { }
    K(K<T>& o) : Super(o) { }
};

Как работает этот код?

Ответы [ 4 ]

4 голосов
/ 04 марта 2011

Может быть написано как

template<typename T>
class K : public std::auto_ptr<T>
{
public:
    K() : std::auto_ptr<T>() { }
    K(T* t) : std::auto_ptr<T>(t) { }
    K(K<T>& o) : std::auto_ptr<T>(o) { }
};

Что является более подробным для инициализации базового класса. Typedef в большинстве случаев чище, если вам приходится иметь дело с шаблонными базовыми классами.

2 голосов
/ 04 марта 2011

Это потому, что класс K наследуется от std::auto_ptr<T>.Происходит следующее: конструкторы K(T* t) и K(K<T>& o) вызывают родительский конструктор std::auto_ptr<T>(...), который также называется Super благодаря typedef.

1 голос
/ 04 марта 2011

Базовый класс auto_ptr<T>, из которого вы производите, является контейнером для элемента класса T. Этот базовый класс имеет (по крайней мере) конструкторы, которые вы вызываете:

Базовый класс можно определить следующим образом (на самом деле это не так, но определения конструктора могут дать вам картину):

template<typename T>
class auto_ptr {
    T* value;
  public:
    auto_ptr() : value(NULL) {}
    auto_ptr(T* t) : value(t) { }
    auto_ptr(auto_ptr<T>& other) : value(other.value) {}
};

Итак, auto_ptr<T> содержит значение типа T. И три определенных конструктора заботятся о:

  • пустое / стандартное строительство
  • конструкция из необработанного указателя
  • копия контейнера

Итак, сообщая классу, вы даете Super имя std::auto_ptr<T>, которое является просто сокращением для вызова соответствующего конструктора базового класса. Вы могли бы написать

template<typename T>
class K : public std::auto_ptr<T>
{
public:
    K() : std::auto_ptr<T>() { }
    K(T* t) : std::auto_ptr<T>(t) { }
    K(K<T>& o) : std::auto_ptr<T>(o) { }
};

потому что вы теперь напрямую вызываете конструкторы базового класса. А те, которые мы определили ранее (и в «реальной жизни», определены более разумно, чем я здесь).

PS: auto_ptr<> приятно, если вы еще не видели unique_ptr<>. auto_ptr<> s "плохой парень" - это конструктор копий. Не упустите C ++ 0x ...

1 голос
/ 04 марта 2011

typedef typedef std::auto_ptr<T> Super; означает, что Super является auto_ptr типа T. Пустой конструктор K инициализирует Super, если указан указатель типа T, то Super инициализируется как auto_ptr, управляющий им, и если ссылка на K с типом T задается, а затем передается в Super.

...