- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想实现一些算法,这些算法在图上运行并返回节点对的分数,指示这些节点是否相似。这些算法应该适用于单个节点对和所有可能的节点对。在后一种情况下,应返回一个集合/矩阵。
算法源自
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 的一个应用程序,具有以下角色:
补充说明:
从 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/
来自 here : bool shouldReclip(covariant CustomClipper oldClipper); AFAIK,关键字covariant 用于重写一个方法,明确告诉分析器
假设我有这两个类 class BaseClass { protected HashSet container; } class DerivedClass : BaseClass { D
问题 我想实现一些算法,这些算法在图上运行并返回节点对的分数,指示这些节点是否相似。这些算法应该适用于单个节点对和所有可能的节点对。在后一种情况下,应返回一个集合/矩阵。 我的方法 算法源自 clas
我刚刚遇到一个关于泛型和协变的有趣问题,长话短说,我花了 30 分钟尝试声明一个类型,直到我放弃。 为了清楚起见:我已经有了解决方法,目前不需要我的项目帮助。我之所以问这个问题是因为我是异常复杂的泛型
我有这样一个类: public class MyClass{ private MyTape data; private List someOtherdata; } 我正在尝试在 And
今天,我深入探讨了Liskov的替代原理和协方差/协方差。 而且我陷入了两者之间的差异: T = TypeVar("T", bound=Union[A, B]) T = TypeVar("T", A,
我正在尝试使用Ceres编写BA优化器,并希望为优化结果计算协方差。但是该程序停留在covariance.Compute(covariance_blocks, &problem)上,似乎永远不会停止计
我正在编写一个名为 Factory 的通用工厂类 //abstract factory template class Factory{ public: virtual C*
当我们有两个结构,并且一个可以隐式转换为另一个时,它看起来像 System.Nullable<>两者的版本也可以隐式转换。就像,如果结构 A隐式转换为 struct B , 然后 A?转换为 B? 这
我正在阅读 Jon Skeet 的《深入了解 C#》。虽然我已经理解了 CoVariance 和 ContraVariance 的概念,但是我无法理解这一行: Well, covariance is
我正在读《深入Scala》第一节,第一节中有两句话是关于“协方差”和“逆变”的: Covariance (+T or ? extends T) is when a type can be coerce
我正在尝试创建一个二叉树类 Tree和二叉搜索树类 BST它继承自 Tree ,以及 iterator每个嵌套类,其中 BST::iterator继承自 Tree::iterator . 现在,问题是
我通过继承创建了两个简单的类,并在子类中添加了一个虚函数和覆盖。 class Parent { public: virtual Parent foo(); }; class Child : p
我有一个非常复杂的类层次结构,其中的类是相互依赖的交叉类:有两个抽象类 A 和 C,它们分别包含一个返回 C 和 A 实例的方法。在他们继承的类中,我想使用协变类型,在这种情况下这是一个问题,因为我不
我试图写一个不可变的 Matrix[A]类(class)。我希望该类在 A 上是协变的但是当我把 +前面A编译器开始提示类中的某些操作。 以下是我的 Matrix 的相关子集类(实际类比以下子集大 5
我读了一些关于用于 CV 对象跟踪的卡尔曼滤波器的著作,但我找不到关于选择的一些引用:1)过程噪声协方差 Q; 2)测量噪声协方差R。到目前为止,我已经意识到该模型是运动方程(有人使用加速度作为状态变
我有以下表示数值数组的类 class Array { protected : double *data; // this will hold the data of the array
我有以下情况: 我指定一个纯虚函数: 虚拟 PredictedMatch PredictMatch(const Match &match) const = 0; 我还有: 类 ImpactPredic
我试图从网上的几篇文章和 StackOverflow 上的问题中找出 Covariance 和 Contravariance 这两个词的确切含义,据我所知,这只是多态性的另一种说法。 我上面的说法正确
新 Guava 10 Optional 状态是自然协变的,因此可以强制转换。 如果我尝试,它看起来有点难看: Optional opti = Optional.of(42); Optional op
我是一名优秀的程序员,十分优秀!