gpt4 book ai didi

c++ - 我怎样才能从模板派生两次,并让子类交互?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:39 25 4
gpt4 key购买 nike

这是我的问题:我写了两个基类:Wire 和 CircuitComponent。这两者几乎足够相似,可以派生自一个共同的父类(super class),但事实并非如此。 Wire 只能与CircuitComponent 连接,CircuitComponent 只能与wire 连接。尽管除了类型之外,实现都是相同的,所以我自然而然地认为模板就是答案。

这是模板,我有一个派生自 TwoTypeMesh<Wire, CircuitComponent> 的 Wire 类和一个派生自 TwoTypeMesh<CircuitComponent, Wire> 的 CircuitComponent 类:

template <class thisType, class otherType>
class TwoTypeMesh {
std::set<otherType *> neighbors;
public:
void join(otherType * n){
if (neighbors.find(n) != neighbors.end()) {
return;
} else {
neighbors.insert(n);
n->join(this);
}
}

void disconnect(otherType * n){
if (neighbors.find(n) == neighbors.end()) {
return;
} else {
neighbors.erase(n);
n->disconnect(this);
}
}
};

问题是我无法编译它,它提示带有 n->join(this) 的行原因this类型为 TwoTypeMesh<Wire, CircuitComponent> ( Wire 的父类(super class))但是 join仅为 wire 定义.

到目前为止,我最好的理论是我不应该子类化,也许是 typedef,但我还没有设法让它工作。

最佳答案

使代码编译的微创方法确实是使用 typedef,或者 tag classes ,或者简单的枚举:

enum MeshType { MeshTypeWire, MeshTypeCircuitComponent };

template <MeshType thisType>
class TwoTypeMesh {
// calculate 'otherType' from 'thisType' (prevents usage mistakes):
static const MeshType otherType =
thisType == MeshTypeWire ? MeshTypeCircuitComponent :
/* else */ MeshTypeWire ;
std::set< TypeTwoMesh<otherType> *> neighbors;
public:
void join(TypeTwoMesh<otherType> * n){
if (neighbors.find(n) != neighbors.end()) {
return;
} else {
neighbors.insert(n);
n->join(this);
}
}

void disconnect(TypeTwoMesh<otherType> * n){
if (neighbors.find(n) == neighbors.end()) {
return;
} else {
neighbors.erase(n);
n->disconnect(this);
}
}
};

typedef TwoTypeMesh<MeshTypeWire> Wire;
typedef TwoTypeMesh<CircuitComponent> CircuitComponent;

关于c++ - 我怎样才能从模板派生两次,并让子类交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5922295/

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