我有以下类定义:

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/

10-10 21:42