我有以下类定义:
class Policy {
public:
virtual DigraphNode getBestMove(DigraphNode &node) const = 0;
};
class NoPolicy : public Policy{
virtual DigraphNode getBestMove(DigraphNode &node) const
{return DigraphNode();}
};
class Agent {
public:
static NoPolicy noPolicy;
Agent() : policy(noPolicy) {}
void setPolicy(Policy &p) {policy = p;}
Policy &getPolicy() {return policy;}
private:
Policy &policy; // pointer so polymorphism should work
};
Agent :: policy可以存储任何Policy后代类的对象。为避免使用指针,我将此成员作为参考。但是,然后我需要在构造函数中对其进行初始化,这迫使我定义一个人工策略NoPolicy,如代码中所示。这可行,但似乎有点人为。
为了使图片更完整,我最终在客户端代码中使用了以下用法:
Policy &policy = Agent::noPolicy;
switch(agentTypes[a]) {
case NON_COMPLIANT:
policy = HeuristicBasedPolicy<MultiHeuristic>(nearExitH);
break;
etc.
如果有人可以提出更优雅的方式,我将不胜感激。谢谢!
备注:代码中的注释已过时。 Agent :: policy当然是参考,不是指针。
-----------------------编辑(基于反馈)------------------- ---------------
根据收到的反馈(谢谢!),我修改了代码。类定义为:
class Policy {
public:
virtual DigraphNode getBestMove(DigraphNode &node) const = 0;
};
class Agent {
public:
Agent() {policy = nullptr;}
void setPolicy(Policy *p) {policy = p;}
Policy &getPolicy() {return *policy;}
private:
Policy *policy; // pointer so polimorphism should work
};
用法是:
vector<Policy *> agentPolicies; // need this only to free memory!
while (node->getDepth()) {
int a = node->getDepth() - 1;
Policy *myPolicy;
switch(agentTypes[a]) {
case NON_COMPLIANT:
myPolicy = new HeuristicBasedPolicy<MultiHeuristic>(nearExitH);
break;
...
}
agents[a].setPolicy(myPolicy);
agentPolicies.push_back(myPolicy);
}
...
for (int i = 0; i < agentPolicies.size(); i++)
delete(agentPolicies[i]);
请让我知道这是否是发表评论和答复的人们的意图。
同样,仅需保留客户端代码第一行中的数组,以保留指针以供以后释放它们。具有仅用于内存管理簿记的数组的正常状态吗?谢谢!
最佳答案
如您所见,引用存在必须
在构造函数中设置。然后永远无法更改。如果这
是您想要的,并且该类不应是可分配的
(在Agent
中可能就是这种情况),然后
参考是有效的解决方案。如果需要上课
可分配的,否则您可能需要更改策略
构造后,指针是通常的解决方案。
更笼统地说,我见过禁止使用的编码准则
推荐成员,因为它们使不可能
对象可分配。我个人不同意,因为
许多类具有标识,并且不应该支持复制和
分配。但这可能是相当习惯的
系统地将指针用作类成员,即使在
参考会起作用。
话虽如此:使用无操作类也是相当习惯的
在这种情况下。具有类不变性通常更容易policy != nullptr
,只需执行policy->something()
不必在各处检查nullptr
。 (你可以
仍然需要指针,但是,因为您可能想要更改
政策之后,尤其是如果NullPolicy
对象已构建。)如果执行此操作,则可以(和
可能应该)具有类似getPolicy
return的函数
一个参考,而setPolicy
之类的功能则作为参考。
另外,像Policy
这样的类可能是不可变的(尤其是
如果您共享它们的实例),那么您应该使用指针
const和对const的引用。
最后:为什么要避免使用指针?好
编写的C ++,至少是面向对象的C ++,将充满
指针。
关于c++ - 这是引用类成员的惯用用法吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24200844/