持有C ++参考是否可以防止变量被破坏?

验证

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

我不想将此颜色设置为具有指针,因为有必要在每个设置方法和解构函数上将其删除。这是一个坏主意吗?

码:

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对象,我不知道该颜色是否为“空” /空状态。

杰里米·弗里斯纳

鉴于

MyShape :: color被声明为Color&

...代码有点问题。

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

由此可见,这段代码实际上是做什么的:

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

被的内容覆盖(无论所引用的Color对象this->color)的内容newColor它根本不会改变引用本身。而是通过引用来编写(请记住,引用被定义为“某物的别名”,因此无论您在何处指定引用,该程序的行为都将如同您在此处指定了对象引用的引用一样)。

要回答名义上的问题:持有C ++引用并不能保证引用所引用的对象不会被破坏。很有可能删除(或销毁)被引用的项目,并以“悬挂引用”结束,如果您尝试使用它,它将调用未定义行为。

作为一般建议,如果您希望有一个保护值来表示“无颜色”,最好的方法是将保护值表示为一个实际的颜色对象(例如Color(0,0,0,0),如果您的Color班级有一个alpha值,则可以工作)-通道,因为alpha = 0的任何颜色都是透明的,因此是无颜色的)。这样,就无需玩带有指针或引用的游戏来尝试表示该信息。如果由于某种原因无法执行此操作,请查看std :: optional作为表示“值或无”的一种方式。

最后一点,当指针指向堆栈对象或成员对象时,使用指针并不意味着必须使用newdelete-指针同样工作良好(并且可能同样严重地摔倒自己)。也就是说,指针非常强大,而且也很危险,因此我不建议您将它们用于此目的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++迭代器是否持有对基础对象的引用?

是否可以防止私有变量被同一类的其他对象更改?

是否可以防止用户在后台运行C ++程序?

[C++]NULL 在内存中实际上是否也持有特定地址?

在变量中持有承诺的未来价值

在PHP中持有函数的类变量

TBYTE可以持有的最大价值

在BAZEL中,是否有一种方法可以防止依赖C / C ++头传播到依赖库?

是否可以防止在没有WHERE子句的情况下执行UPDATE或DELETE语句?

检查nullptr 100%是否可以防止有关内存布局的段错误?

是否有任何方法可以防止用户创建上帝模式文件夹

Javascript:是否有任何方法可以防止将对象重复放入数组?

Elasticsearch - 是否有选项或标志可以防止使用 quires 搜索索引

Elasticsearch 是否有任何内置功能可以防止在指定条件下索引文档?

在这种情况下,C#泛型是否可以防止结构自动装箱?

是否可以防止在Objective-C中污染POSIX符号名称?

是否可以防止gtest(C ++)捕获异常和分段错误?

当一个变量持有的位/字节少于c ++中另一个变量的位/字节有什么区别

持有键的变量在更新时更新字典对象

onbindViewHolder不接受视图持有者变量

为什么全局变量不持有价值

Java线程可以在持有锁的同时获取锁吗?

对象可以自己持有价值并返回它

Python apt API可以检测到“持有”包装吗?

互斥锁是否总是由线程持有?

确定当前线程是否持有Java`Lock`

如何检查Java中的sleep()方法是否持有锁?

检查是否持有锁,如果空闲则不锁

如何判断当前会话是否持有锁?