gpt4 book ai didi

c++ - 防止兄弟结构的平等比较

转载 作者:可可西里 更新时间:2023-11-01 18:15:41 26 4
gpt4 key购买 nike

出于代码重用的目的,我有许多从同一基派生的结构,但我不想要任何形式的多态性。

struct B {
int field;
void doStuff() {}
bool operator==(const B& b) {
return field == b.field;
}
};

struct D1 : public B {
D1(int field) : B{field} {}
};
struct D2 : public B {
D2(int field) : B{field} {}
};

结构 D1D2(以及更多类似的结构)派生自 B 以共享公共(public)字段和方法,因此我不需要在每个派生类中复制这些字段和方法。

Struct B 永远不会被实例化;我只使用 D1D2 的实例。此外,D1D2 根本不应该相互交互。本质上,我不想要任何多态行为:D1D2,出于所有目的,应该充当不相关的结构。

我希望将任何 D1 与其他 D1 进行相等性比较,并将任何 D2 与其他 进行比较D2 代表平等。由于 D1D2 不包含任何字段,因此在结构 B 中定义相等运算符似乎是合适的。

但是,(如预期的那样)我在 D1D2 之间得到以下交互:

int main() {
D1 d1a(1);
D1 d1b(1);
D2 d2(1);

assert(d1a == d1b); // good

assert(d1a == d2); // oh no, it compiles!
}

我不想比较 D1D2 对象,因为出于所有目的,它们应该表现得好像它们不相关。

如何在不复制代码的情况下使最后一个断言成为编译错误?为 D1D2(以及所有其他类似结构)分别定义相等运算符将意味着代码重复,因此我希望尽可能避免这种情况。

最佳答案

“结构 D1 和 D2(以及更多类似的结构)派生自 B 以共享公共(public)字段和方法”

然后使 B 成为 private 基类。显然,D1D2 不应共享相等运算符,因为这两个运算符采用不同的参数。您当然可以将部分实现共享为 bool B::equal(B const&) const,因为外部用户无法访问它。

关于c++ - 防止兄弟结构的平等比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51362342/

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