好奇的循环继承与C++中的混合
Curious circular inheritance with mix-ins in C++
在这里解开循环继承的好方法是什么?
class Node {
// ...
public:
list<Node*> neighbors() { /* ... */ }
void update() { }
}
template<class NodeType>
class HasImportance : public virtual NodeType {
double m_importance = 0.0;
public:
void receive_importance(double imp) { /* ... */ }
void give_importance() {
for (auto neighbor : this->neighbors())
neighbor->receive_importance(m_importance /* ... */);
}
};
class TrafficLight : public HasImportance<TrafficLight>, virtual Node {
public:
list<TrafficLight*> neighbors() { ... }
void update() { give_importance(); /* ... */ }
};
它失败(gcc 4.7.0),因为TrafficLight
是一个不完整的类型当HasImportance
尝试从它继承时。
真正的问题是 HasImportance 需要知道返回的类型 neighbors()
.如果HasImportance
继承自 Node
,则认为neighbors()
返回一个列表 Node*
,而不是TrafficLight*
,因此不会知道它可以调用项目receive_importance()
。类似如果HasImportance
根本没有继承,则出现问题。
顺便说一句,我想做的是做一些混合来帮助定义各种轻松使用不同类型的图表,并分别对每个混入进行单元测试。为例如,我应该能够通过编写来定义交通信号灯图的节点类像class TrafficLight : public HasImportance, HasState<3>,
virtual Node { }
.
我想出了三种方法来解决这个问题,但看起来都很丑陋。(1) static_cast<NodeType*>
.(2)TrafficLight
通过其 this
在其构造函数中HasImportance
。这边 HasImportance
根本不需要继承;它只是存储一个指向 (ahem) 本身的指针,模板参数提供指针。(3) 将Node
作为类模板,如下所示:
template<class NodeType>
class Node {
public:
list<NodeType*> neighbors() { /* ... */ }
}
class TrafficLight : public HasImportance<Node<TrafficLight>> { /* ... */ }
编译并且不会引入this
的免费副本,但似乎...有点太好奇了。
这里有代码气味吗?我应该完全接近这些图表吗不同的方式?
(3) 但有点不同。
template <class NodeType>
class Node { ... };
template<class NodeType>
class HasImportance : public virtual Node<NodeType> { ... };
class TrafficLight : public HasImportance<TrafficLight> { ... };
对我来说看起来完全直截了当,并不比 CRTP 本身更好奇。
相关文章:
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- D3D11-将混合权重和索引传递到顶点着色器
- C++分数混合比较运算符错误
- 是否可以混合使用SFINAE和模板专业化?
- 如何在 Python C++ 混合库中调试非确定性分段错误?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- C++11 中的混合列表初始化
- C++以迭代方式搜索混合类型地图
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 混合 Rcpp 模块和 Rcpp::export
- C++/CLI 混合托管/本机 DLL 不起作用
- 在C++中混合覆盖和重载
- 关于 Direct3D9 中的 alpha 混合的问题
- 使用英特尔内部函数 (AVX) 中的混合说明
- C++ 中混合二进制/文本日志记录的最佳做法
- Fortran 和 C++ 的混合编程:Fortran 不能调用C++子程序
- 错误:在 C++ 目标 c 混合'self'使用未声明的标识符
- 是否有一个版本的glCopyImageSubData在Openg GL中使用混合?
- 为什么这个混合继承程序给出错误的输出?