gpt4 book ai didi

c++ - 持有 C++ 引用是否可以防止变量被破坏?

转载 作者:行者123 更新时间:2023-12-01 14:04:22 26 4
gpt4 key购买 nike

来自 Java/C# 背景,我正在尝试实现一个空安全检查对象。以下代码尝试检查对象上是否确实存在颜色。如果有,我希望能够做一些事情(比如在形状上绘制颜色)。我希望能够将此颜色设置回 null (noneColor),以防止为对象着色。

我不想设置这个颜色有一个指针,因为有必要在每个 setter 和 deconstructor 上删除它。这是一个坏主意吗?

代码:

static const Color& noneColor = Color();

static bool isNoneColor(const Color& color) {
return std::addressof(noneColor) == std::addressof(color);
}

MyShape:MyShape() {
this->color = noneColor; // this->color is an object of Color
}

void MyShape::setColor(const Color& newColor)
{
this->color= newColor;
}

void MyShape::draw()
{
if(!isNoneColor(this->color))
// Color shape
}

//different scope/class
void B::setColorForShape()
{
Color color = Color(255,255,255);
a->setColor(color);
// Calling isNoneColor(a->color); should return false;
// After this function ends does variable a->color have undefined behavior?
}

void B::setNoneColorForShape()
{
a->setColor(noneColor);
//Calling isNoneColor(a->color); should return true;
}

方法结束后用 a->color 调用 isNoneColor 是否安全?

编辑:
MyShape:color声明有 Color& color .我希望能够在我的对象上设置 noneColor 状态 MyShape .使用简单的 Color 对象,我不知道该颜色是否为“null”/空状态。

最佳答案

鉴于

MyShape::color is declared as a Color&



...代码有点问题。

关于 C++ 引用需要了解的是,您不能重新定位它们——也就是说,与 C++ 指针不同,一旦声明了 C++ 引用,它将始终引用它被声明引用的对象,并且不能重新- 指向引用其他对象。 (顺便说一句,这也是不允许您声明未绑定(bind)引用的原因,例如 MyColor & c; 不会编译,因为它没有用)

由此可见,这段代码实际上做了什么:
void MyShape::setColor(const Color& newColor)
{
this->color= newColor;
}

Color 的内容覆盖(无论 this->color 对象 newColor 引用的内容)的内容)。它根本不会改变引用本身;而是通过引用写入。 (请记住,引用被定义为对某事物的别名,因此无论您在何处指定引用,程序都会表现得好像您已在那里指定了对象引用)

回答名义问题:持有 C++ 引用并不能保证引用所引用的对象不会被破坏。很有可能删除(或以其他方式销毁)引用的项目,并最终得到一个“悬空引用”,如果您尝试使用它,它将调用未定义的行为。

作为一般建议,如果你想有一个保护值来表示“无颜色”,最好的方法是将保护值表示为一个实际的颜色对象(例如,如果你的 Color(0,0,0,0) 类有 Color 可以工作一个 alpha channel ,因为任何 alpha=0 的颜色都是透明的,因此没有颜色)。这样,就无需使用指针或引用来玩游戏来尝试表示该信息。如果由于某种原因这不可行,请查看 std::optional 作为表示“非值即无”的一种方式。

最后一点,使用指针并不意味着您必须使用 newdelete —— 当指针指向堆栈对象或成员对象时,它们同样可以很好地工作(而且您可以同样糟糕地用它们来打自己的脚)。也就是说,指针很强大,也很危险,我不建议将它们用于此目的。

关于c++ - 持有 C++ 引用是否可以防止变量被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62073288/

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