Объект того же типа, что и класс - PullRequest
4 голосов
/ 09 октября 2011

В c ++ как мне получить объект того же типа, что и содержащий его класс, например:

class Test
{
public:

private:
  Test t;
};

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Короткий ответ, вы не можете.

Вы можете иметь указатель на объект того же типа, но не на сам объект.

Если вам НУЖНО сделать это (то есть), вы не можете использовать указатель, возможно, ваш дизайн ошибочен. Если вы можете использовать указатель, используйте его.

Некоторые причины:

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

Каким будет sizeof() для объекта?

2 голосов
/ 09 октября 2011

Вы не можете этого сделать, поскольку это потребует бесконечной рекурсии. (Ваш t будет содержать еще t, поэтому у вас будет t.t.t.t.t.t.t.t.... до бесконечности). Однако вы можете поместить указатель на другой объект внутри, например,

private:
   Test *t;

Проблема в том, что когда вы пишете:

Test t;

Компилятору необходимо , чтобы узнать размер Test, чтобы обеспечить достаточное хранилище. В тот момент, когда вы написали Test t;, этот размер неизвестен, потому что компилятор не видел конца определения Test (то есть ; после закрытия }) и, следовательно, не может определить размер его.

1 голос
/ 09 октября 2011

Это невозможно .В максимуме вы можете иметь ссылку или указатель того же class внутри него.

class Test
{
private:
  Test *t;
};

В качестве примечания, static объекты разрешены.Это потому, что они на самом деле не связаны с каким-либо конкретным экземпляром объекта class.т.е.:

class Test
{
private:
  Test t; // error
  static Test st; // ok!
};  // define 'st' in the translation unit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...