Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Templates_Circular Dependency_Mixins_Crtp - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,templates,circular-dependency,mixins,crtp,C++,Templates,Circular Dependency,Mixins,Crtp,什么是解读循环继承的好方法 类节点{ // ... 公众: 列出邻居(){/*…*/} 无效更新(){} } 模板 类的重要性:公共虚拟节点类型{ 双m_重要性=0.0; 公众: 无效接收重要性(双imp){/*…*/} 不重视{ 对于(自动邻居:此->邻居()) 邻居->接收重要性(m_重要性/*…*/); } }; 类TrafficLight:公共节点、虚拟节点{ 公众: 列出邻居(){…} 无效更新(){give_importance();/*…*/} }; 它失败(gcc 4.7.0)

什么是解读循环继承的好方法

类节点{
// ...
公众:
列出邻居(){/*…*/}
无效更新(){}
}
模板
类的重要性:公共虚拟节点类型{
双m_重要性=0.0;
公众:
无效接收重要性(双imp){/*…*/}
不重视{
对于(自动邻居:此->邻居())
邻居->接收重要性(m_重要性/*…*/);
}
};
类TrafficLight:公共节点、虚拟节点{
公众:
列出邻居(){…}
无效更新(){give_importance();/*…*/}
};
它失败(gcc 4.7.0),因为
TrafficLight
是一种不完整的类型 当
具有重要性时
尝试从中继承

真正的问题是HasImportance需要知道返回的类型
邻居()
。如果
具有重要性
继承自
节点
,然后它认为
邻居()
返回
节点*
,而不是
交通灯*
,因此不会 知道它可以对项目调用
receive\u importance()
。相似的 如果
具有重要性
根本不继承,则会出现问题

顺便说一句,我想做的是做一些混合,以帮助定义各种 不同类型的图很容易,并且可以单独对每个混合进行单元测试。对于 例如,我应该能够通过编写 类似于
class TrafficLight:public hassimportance,HasState,
虚拟节点{}

我想出了三种方法来解决这个问题,但都很难看。(1)
static\u cast
。(2)
交通灯
通过其
在其构造函数中具有重要性
。这边
具有重要性
根本不需要继承;它只存储一个 指向(ahem)本身的指针,模板参数提供 指针。(3) 将
节点
制作为类模板,如下所示:

模板
类节点{
公众:
列出邻居(){/*…*/}
}
类TrafficLight:公共重要性{/*…*/}
编译后,它不会引入此的免费副本, 但似乎…有点太奇怪了

这里有代码气味吗?我是否应该以完全不同的方式处理这些图表 不同的方式?

(3)但有点不同

template <class NodeType>
class Node { ... };

template<class NodeType>
class HasImportance : public virtual Node<NodeType> { ... };

class TrafficLight : public HasImportance<TrafficLight> { ... };
模板
类节点{…};
模板
类HasImportance:公共虚拟节点{…};
类交通灯:公共交通灯{…};

对我来说,这看起来非常简单,并不比CRTP本身更奇怪。

在CRTP中使用
static\u cast(这)
是正常的。@KennyTM:我甚至会说这是使用CRTP的关键。谢谢。我对使用static_cast感到畏缩,因为我似乎忽略了一个迹象(一种“气味”),即更深层次的问题。如果这在CRTP中是“正常”的,我想我不会抵抗这么多。这是我的第一个CRTP。你能告诉我吗?:)谢谢我更喜欢这个,尽管差别很小。与我的版本不同,mix-ins的“编译时接口”现在很简单,并且对代码中其他地方的更改免疫。