我是一名新手C ++程序员,试图在宠物项目上磨练自己的技能,我遇到了以下问题。
我有一个名为System的类,它包含另一个类Agent的单个Object。我希望外部源以下列方式调用Agent类对象的方法:
system.agent().exploration(3.0);
explore(3.0)将agent的内部变量设置为3.0。为此,我通过引用返回Agent对象:
Agent& agent() {return agent;}
虽然这样可行,但仍有可能按照以下方式更改代理:
system.agent() = Agent(1.0,2.0);
在我的情况下,这是不受欢迎的行为。为了解决这个问题,我想可以将Agent作为const引用返回:
const Agent& agent() {return agent;}
但是这段代码没有编译,因为方法探索(float e)是非const的(它修改了代理对象的内部变量)。
通过System类使代理对象公共接口可用于外部世界而不允许某人完全替换代理对象的正确方法是什么?
答案 0 :(得分:1)
您可以在System类中编写一个包含代理函数的函数。
class System
{
private:
Agent agent;
public:
void exploration(float num) { agent.exploration(num); }
//...
};
答案 1 :(得分:0)
如果您不想允许复制,则应在私有下实现自己的重载赋值运算符,但不实现它。这将不允许编译器创建它自己的赋值运算符,因此不允许复制。
答案 2 :(得分:0)
有许多可能的解决方案:使用类代理,修改代理的operator=
,如果你不需要getter,那么只在系统中实现一个探索方法。
但是我建议你将探测器实现为visitor
,最好的做法是当你必须调度到子对象时,它很容易实现,你可以通过重载获得一个很好的接口operator()
当您对子对象执行许多不同的操作时,它会使您免于重复代码。
http://en.wikipedia.org/wiki/Visitor_pattern