我是 C++ 新手,正在努力理解数据抽象与二进制方法(例如相等)的结合。我想定义一个接口(interface)
class A {
public:
static A* Make(int);
virtual ~A() {};
virtual bool Eq(A*) = 0;
};
使用工厂模式,我可以隐藏实现:
class B : public A {
public:
B(int x) : x_(x) {}
bool Eq(A* a) {
return x_ == dynamic_cast<B*>(a)->x_;
}
private:
int x_;
};
A* A::Make(int x) {
return new B(x);
}
然后我可以使用抽象:
A* a = A::Make(1);
A* b = A::Make(2);
if (a->Eq(b)) {
cout << "Yes!" << endl;
} else {
cout << "No!" << endl;
}
然而,由于多种原因,动态 Actor 阵容很糟糕。我认为最大的问题是可以用 C 子类 A,然后将 C 类型的对象传递给 a->Eq,这将导致未定义的行为。我无法弄清楚如何定义二进制方法,以便代码可以访问两个对象的私有(private)成员。我的直觉是,这可以使用访问者模式来完成,但我无法想出解决方案。
对于那些了解机器学习的人来说,我基本上想做以下事情:
module A : sig
type t
val make: int -> t
val eq: t -> t -> bool
end = struct
type t = int
let make x = x
let eq x y = (x = y)
end
最佳答案
您不想将相等函数设为虚拟。
这是一个例子:
class Animal
{
public:
virtual bool is_equal(const Animal * p_a) = 0;
};
class Human : public Animal
{
public:
bool is_equal(const Animal * p_a);
};
class Toad : public Animal
{
public:
bool is_equal(const Animal * p_a);
};
如果我创建两个指向 Animals 的指针变量:
Animal * p_animal_human = new Human;
Animal * p_animal_toad = new Toad;
虚拟 is_equal
方法允许我比较两个动物类:
if (p_animal_human->is_equal(p_animal_toad)
这可能会导致一大堆运行时错误,在本例中,您不想将人类
与蟾蜍
进行比较。您可能想要比较两个 Human
实例或两个 Toad
实例。
在上面的 if
语句中,仅比较两个类共有的 Animal
数据。
在 StackOverflow 中搜索术语“[C++] 切片”。
关于c++ - C++ 中的数据抽象和二进制方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18550621/