c++ - 一个类是否可以拥有将当前类作为参数的成员
问题描述
我的问题很简单:你能有这样的东西:
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);
}
解决方案
当std::vector<Player<Game>*> players;
被解析时,Game
的定义还没有完成。因此Game
将被认为是不完整的类型,直到它是。然后T=Game
在它们各自的实例化时也是不完整的Player
。Card
这本身不是问题。可以使用不完整的类型,但有一份禁止使用它们的情况列表(请参阅https://en.cppreference.com/w/cpp/language/type#Incomplete_type以获取参考列表)。
从您的定义来看Player
,Card
它似乎不需要完整的 for 类型T
,但是这高度依赖于您遗漏的代码,例如,如果它们中的任何一个具有 typeT
或 type 依赖的数据成员T
,那么可能有一个问题。
还有一个问题是是否std::vector
可以接受不完整的类型作为模板参数。在 C++17 之前这是不允许的,因为 C++17 至少在声明中是允许的(但不允许访问其成员)。在任何情况下,鉴于您Card<T>
在std::vector<Card<T>> hand;
实例化的代码T=Game
是完整的,因此向量不是问题。
(代码发布的方式,模板声明顺序中还有一个问题,我没有解决这个问题,因为我知道包含顺序和前向声明)
推荐阅读
- javascript - 转发状态与转发道具到子组件
- c# - 使用 ViewComponent 类的路由问题
- android - Maven:依赖项:get -DoutputDirectory 不起作用。(如何将具有所有依赖项的工件下载或复制到特定文件夹?)
- python - Google API Python 客户端:“从 Six.moves 导入 zip ImportError:没有名为 move 的模块”
- java - 如何在 Java 中以这种模式打印不同的字符串?
- ssas - 如何在 MDX 中根据过滤日期运行总计?
- php - 注册表不显示输入
- php - 使用 POST 和 GET 请求相同路由时保持请求?
- c# - 使用 openXML SDK 填充 word 模板数据
- java - 如何将字符串输入存储到不同的变量中?