gpt4 book ai didi

C++类设计: Covariance

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:23 24 4
gpt4 key购买 nike

问题

我想实现一些算法,这些算法在图上运行并返回节点对的分数,指示这些节点是否相似。这些算法应该适用于单个节点对和所有可能的节点对。在后一种情况下,应返回一个集合/矩阵。

我的方法

算法源自

class SimilarityAlgorithm {
public:
Base(const Graph& G);

virtual double run(node u, node v) = 0; // indices for nodes in the graph

virtual ScoreCollection& runAll() = 0;
}

现在算法在内存使用上有所不同。某些算法可能是对称的,并且 (u, v) 和 (v, u) 的分数相同。这需要应返回不同的 ScoreCollection 类型。一个示例是均派生自 ScoreCollection 的稀疏矩阵和三角矩阵。

这可以归结为协变返回类型:

class SpecificAlgorithm : SimilarityAlgorithm {
public:
double run(node u, node v);

// The specific algorithm is symmetric and thus uses a symmetric matrix to save memory
SymmetricScoreCollection& runAll();
}

问题

  • 对于这个问题,这种设计方法是个好主意吗?
  • 是否应该公开集合全部作为矩阵实现的事实?

最佳答案

您的设计似乎适合您描述的问题。

问题:

但是,您的 SpecificAlgorithm 存在问题:runAll() 返回的类型与基类的虚函数不同。因此它不会被调用(或者更可能的是,您的代码由于缺少虚函数而无法编译)。

解决方案:

通过使 SymmetricScoreCollection 成为 ScoreCollection 的派生类,对 ScoreCollection 也使用多态方法:

class SymetricScoreCollection: public ScoreCollection {
//define the member functions to access the values virtual
...
};

class SpecificAlgorithm : public SimilarityAlgorithm {
public:
double run(node u, node v);

// The specific algorithm is symmetric and thus uses a symmetric matrix to save memory
ScoreCollection& runAll();
};

实际上它是factory method pattern 的一个应用程序,具有以下角色:

  • SimilarityAlgorithm 是工厂,
  • SpecificAlgorithm 是具体的工厂
  • ScoreCollection 是产品
  • SymetricScoreCollection 是具体产品

补充说明:

runAll() 返回对 ScoreCollection 的引用会带来一些风险。假设 sa 是一个特定的算法。

在下面的声明中:

ScoreCollection sc = sa.runAll();

sa.runAll() 返回对 SymetricScoreCollection 的引用,但它会将引用的对象复制到 sc,使其成为 ScoreCollection。 Slicing发生,多态性将无法工作。

但是下面的语句会成功:

ScoreCollection& rsc = sa.runAll();

因为 rsc 是一个引用,它仍然引用 sa.runAll() 返回的原始 SymetricScoreCollection 对象,所以一切都会按设计工作。

您会发现在返回引用时很容易出现未被注意到的错误。我建议返回一个指针而不是一个引用。

关于C++类设计: Covariance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28264208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com