繁体   English   中英

返回const引用和非const成员函数调用

[英]Return a const reference and non const member function call

我是一位新手C ++程序员,试图磨练我在宠物项目上的技能,但我遇到以下问题。

我有一个名为System的类,其中包含另一个类Agent的单个Object。 我希望外部资源以以下方式调用Agent类对象的方法:

system.agent().exploration(3.0);

其中Exploration(3.0)将主体的内部变量设置为3.0。 为了做到这一点,我通过引用返回了Agent对象:

Agent& agent() {return agent;}

尽管这可行,但是仍然可以按以下方式更改代理:

system.agent() = Agent(1.0,2.0);

就我而言,这是不受欢迎的行为。 为了解决这个问题,我可以将Agent作为const引用返回:

const Agent& agent() {return agent;}

但是,此代码无法编译,因为exploration(float e)方法是非常量的(它修改了agent对象的内部变量)。

在不允许某人完全替换代理对象的情况下,通过System类使代理对象公共接口可用于外部世界的正确方法是什么?

您可以在System类中编写一个包装Agent函数的函数。

class System
{
private:
    Agent agent;
public:
    void exploration(float num) { agent.exploration(num); }
    //...
};

如果您不想允许复制,则应在private下实现自己的重载赋值运算符,但不要实现它。 这将不允许编译器创建其自己的赋值运算符,从而不允许进行复制。

有许多可能的解决方案:使用类代理,修改代理的operator= ,如果不需要吸气剂,则仅在系统中实现探索方法。

但是我建议您将explorer实现为visitor ,这是最佳实践,当您必须分派给子对象时,它很容易实现,您可以通过重载operator()来获得一个不错的接口,并且在执行以下operator()时避免重复代码您需要对子对象执行许多不同的操作。 http://en.wikipedia.org/wiki/Visitor_pattern

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM