gpt4 book ai didi

c++ - 为什么不允许我调用由 const 引用返回的对象的方法?

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:13 26 4
gpt4 key购买 nike

这是我之前关于在 C++ 中返回引用的问题的后续问题:Best way to return an object in c++?

我可以成功返回一个引用,但是,我无法阻止观察者完全覆盖相关变量。我使用了 const 引用,但我希望观察者能够更改值。

代码如下:

class Layer {
public:
Channel& getChannel();
private:
Channel channel;
};

// return reference to channel
Channel& Layer::getChannel() {
return channel;
};

// FINE
layer.getChannel().someMethod();

// BAD: PRIVATE MEMBER IS OVERWRITTEN
layer.getChannel() = Channel();

现在我很确定要防止这种情况,我必须更改函数的签名以返回 const 引用,但是,我无法调用 someMethod之后:

// CHANGE TO CONST REFERENCE
Channel const& Layer::getChannel() {
return channel;
};

// return const ref of channel
Channel const& channel = layer.getChannel();

// ERROR!!
// 'Channel::someMethod' : cannot convert 'this' pointer from 'const Channel' to 'Channel &'
channel.someMethod();

正确的写法是什么——有没有办法防止覆盖私有(private)变量?

最佳答案

将所有应该在 const 对象上调用的方法标记为 const:

class Layer
{
// ...

public:

void someMethod() const;
};

void Layer::someMethod() const
{
// ...
}

请注意,除了声明为 mutable 的数据成员外,您不能在 const 方法中改变对象(这种情况非常罕见;想到的是延迟初始化的哈希值)。

如果您想阻止赋值,只需将赋值运算符声明为private:

class Layer
{
// ...

private:

Layer& operator=(const Layer&);
};

关于c++ - 为什么不允许我调用由 const 引用返回的对象的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781026/

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