gpt4 book ai didi

c++ - C++ 中的数据抽象和二进制方法

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:59 26 4
gpt4 key购买 nike

我是 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;
}

但是,由于各种原因,动态转换很糟糕。我认为最大的问题是可以用 C 子类化 A,然后将 C 类型的对象传递给 a->Eq,这将导致未定义的行为。我不知道如何定义二进制方法,以便代码可以访问两个对象的私有(private)成员。我的直觉是这可以使用访问者模式来完成,但我无法想出解决方案。

对于那些了解 ML 的人,我主要想做以下事情:

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)

这可能会导致一大堆运行时错误,如本例所示,您不想比较 HumanToad 是否相等。您可能想要比较两个 Human 实例或两个 Toad 实例。

在上面的if 语句中,只比较了两个类共有的Animal 数据。

在 StackOverflow 中搜索术语“[C++] 切片”。

关于c++ - C++ 中的数据抽象和二进制方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18550621/

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