gpt4 book ai didi

c++ - 有时为 const 的成员函数

转载 作者:IT老高 更新时间:2023-10-28 22:35:16 26 4
gpt4 key购买 nike

我有一个类似于以下的类设计:

class MyClass {
public:
bool IsValid() const;
void MakeValid();
private:
bool CheckValidity(bool fix);
};

bool MyClass::IsValid() const {
// Check validity, but don't fix any problems found. Doesn't work.
return CheckValidity(false);
}

void MyClass::MakeValid() {
// Check validity and fix problems found.
CheckValidity(true);
}

IsValid 应该是 const,因为它不会进行更改。 MakeValid 应该是非常量的,因为它确实会进行更改。它们共享相同的实现,CheckValidity,但由于 CheckValidity 可能会或可能不会进行更改,因此不能将其标记为 const

处理此问题的最佳方法是什么?最简单的方法是只使用 const_cast,但是抛弃 const 感觉有点脏:

bool MyClass::IsValid() const {
// Check validity, but don't fix any problems found.
return const_cast<MyClass*>(this)->CheckValidity(false);
}

这是对 const_cast 的合法使用吗?有更好的方法吗?

最佳答案

我假设您的实现类似于以下内容:

bool CheckValidity(bool fix)
{
// Actually check validity.
bool isValid = ...;

if (!isValid && fix)
{
// Attempt to fix validity (and update isValid).
isValid = ...;
}

return isValid;
}

您确实将两种不同的功能合二为一。这种纠缠的关键指标之一是函数的 bool 参数......它闻起来很臭,因为调用者在不引用代码/文档的情况下无法立即辨别是真还是假。

拆分方法:

bool CheckValidity() const
{
// Actually check validity.
bool isValid = ...;
return isValid;
}

void FixValidity()
{
// Attempt to fix validity.
// ...
}

然后您的公共(public)方法可以更恰本地进行调用。

bool IsValid() const
{
// No problem: const method calling const method
return CheckValidity();
}

void MakeValid()
{
if (!CheckValidity()) // No problem: non-const calling const
{
FixValidity(); // No problem: non-const calling non-const
}
}

关于c++ - 有时为 const 的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29036254/

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