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

标签 c++ abstract-class ml

我是 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/

相关文章:

sml - SML `o` 运算符仅对单参数函数有用吗?

haskell - 如何理解《纯函数式数据结构》中的分段二叉堆

c++ - 从 char 到枚举的 static_cast 分配了错误的值

c++ - 为什么两个不同的概念都称为 "heap"?

c++ - 具有密集和稀疏指针的分配器 - 发生了什么事?

c++ - unique_ptr < 0 或者小于运算符做什么?

ruby-on-rails - 如何编写和继承 ActionController::TestCase 的抽象子类

java - 抽象类的具体用途是什么?

Java初始化抽象类

list - 从 OCaml 中的列表中返回元素列表