Может ли класс иметь членов, которые принимают в качестве аргумента текущий класс - PullRequest
0 голосов
/ 29 ноября 2018

Мой вопрос прост: можете ли вы иметь что-то вроде этого:

class A {
    B<A> member;
}

Вот очень упрощенная версия моей программы:

//Game.h

class Game{
     std::vector<Player<Game>*> players;
}

//Player.h

template <typename T>
class Player{
     std::vector<Card<T>> hand;
}

//Card.h
template <typename T>
class Card {
    virtual void playCard(T& game);
}

1 Ответ

0 голосов
/ 29 ноября 2018

Когда std::vector<Player<Game>*> players; проанализирован, определение Game еще не завершено.Поэтому Game будет считаться неполным типом до тех пор, пока оно не будет.Тогда T=Game в Player и Card также неполны в своих соответствующих экземплярах.

Само по себе это не проблема.Можно использовать неполные типы, но есть список ситуаций, в которых их использование запрещено (список ссылок см. https://en.cppreference.com/w/cpp/language/type#Incomplete_type).

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

Существует также вопрос, может ли std::vector принять неполный тип в качестве аргумента шаблона.До C ++ 17 это было запрещено, так как C ++ 17 разрешено, по крайней мере, в объявлении (но не для доступа к его членам).В любом случае, учитывая, что ваш код Card<T> в std::vector<Card<T>> hand;, инстанцированный с T=Game, завершен, и поэтому вектор не является проблемой.

(Способ, которым был отправлен код, также имеет место впорядок объявления шаблона, к которому я не обращался, так как я знаю порядок включения и предварительные объявления)

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