gpt4 book ai didi

c++ - C++ 中带有混合插件的奇怪循环继承

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:22 24 4
gpt4 key购买 nike

这里有什么好的解读循环继承的方法?

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通过它的 thisHasImportance在它的构造函数中。这条路, 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++ 中带有混合插件的奇怪循环继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11311222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com