首页 > 解决方案 > 一个类是否可以拥有将当前类作为参数的成员

问题描述

我的问题很简单:你能有这样的东西:

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);
}

标签: c++templates

解决方案


std::vector<Player<Game>*> players;被解析时,Game的定义还没有完成。因此Game将被认为是不完整的类型,直到它是。然后T=Game在它们各自的实例化时也是不完整的PlayerCard

这本身不是问题。可以使用不完整的类型,但有一份禁止使用它们的情况列表(请参阅https://en.cppreference.com/w/cpp/language/type#Incomplete_type以获取参考列表)。

从您的定义来看PlayerCard它似乎不需要完整的 for 类型T,但是这高度依赖于您遗漏的代码,例如,如果它们中的任何一个具有 typeT或 type 依赖的数据成员T,那么可能有一个问题。

还有一个问题是是否std::vector可以接受不完整的类型作为模板参数。在 C++17 之前这是不允许的,因为 C++17 至少在声明中是允许的(但不允许访问其成员)。在任何情况下,鉴于您Card<T>std::vector<Card<T>> hand;实例化的代码T=Game是完整的,因此向量不是问题。

(代码发布的方式,模板声明顺序中还有一个问题,我没有解决这个问题,因为我知道包含顺序和前向声明)


推荐阅读