gpt4 book ai didi

C++ - 检查所有成员变量的条件

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

我的情况的简化示例:

我有一个类有 3 个成员变量,都是整数,例如

class Foo
{
public:
int A;
int B;
int C;
};

如果所有成员变量都为 0,我想要一个返回 bool 值 true 的函数,否则返回 false

很简单,可以用这个成员函数来完成:

bool all_zero()
{
return (A == 0 && B == 0 && C == 0);
}

如有必要,我可以这样做。

但是,这在我的情况下并不理想,因为:

  1. 我不是唯一管理此软件的人。

  2. 偶尔,新的成员变量会被添加到这个类中(例如 int D)。

  3. 这是一个非常大的 C++ 项目,我们通常不会通过手动修改代码直接向类中添加新的成员变量,而是使用自定义工具自动为我们修改代码。因此,我们很少对此类进行手动修改。

  4. 此外,由于这个项目太大,上面的all_zero函数很容易被忽略(即有人可能忘记,或者完全不知道添加&& D == 0 如果添加了新的成员变量,则添加到函数中)。

综上所述……这是我的问题:

有什么方法可以修改这个 all_zero 函数,让它总是检查所有 成员变量(int 类型),而不需要告诉函数明确检查每一个?顺便说一句,如果此功能是在类外部完成的(而不是在具有成员函数的类内部),我也可以接受。

我希望我不必求助于此,但对我来说最糟糕的情况是我可以坚持上面这个原始的 all_zero 想法,只是程序化添加一个新的成员变量添加到此类,基本上告诉任何人向类添加成员变量也必须手动修改此 all_zero 函数。

最佳答案

bool all_zero() const
{
Foo f{}, g{};
g = *this;
return ::memcmp(&f, &g, sizeof(f));
}

是一种方式,假设您的类是普通可复制{} 将对成员进行零初始化,包括任何填充位,编译器生成的赋值运算符将复制成员以进行比较。

很可能我们很快就会得到编译器生成的 ==,这可能会更好。参见 https://isocpp.org/blog/2016/02/a-bit-of-background-for-the-default-comparison-proposal-bjarne-stroustrup .

最后如果比较方法需要在类外,再考虑

bool all_zero(const Foo& f)
{
Foo g{}, h{};
h = f;
return ::memcmp(&g, &h, sizeof(f));
}

关于C++ - 检查所有成员变量的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443277/

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