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



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

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

system.agent().exploration(3.0);

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

Agent& agent() {return agent;}

尽管这是有效的,但仍然有可能有人按照以下方式更改代理:

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

就我而言,这是不必要的行为。为了解决这个问题,我可以返回Agent作为常量引用:

const Agent& agent() {return agent;}

然而,由于方法探索(float e)是非常量的(它修改了代理对象的内部变量),因此此代码不会编译。

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

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

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

如果你不想允许复制,你应该在private下实现自己的重载赋值运算符,但不实现它。这将不允许编译器创建自己的赋值运算符,因此不允许复制。

有很多可能的解决方案:使用类代理,修改代理的operator=,如果不需要getter,那么只在系统中实现一个探索方法。

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

最新更新