如何在 C++ 中正确使用接口和数据抽象?

How to properly use interfaces and data abstraction together in C++?

我对 C 和 Java 相当有信心,并且刚开始使用 C++,仍然习惯了有关最佳实践的基础知识,包括 数据抽象(其中,作为据我了解,这意味着正确的 header 用法)。

我想做一个项目来解决不同类型的问题,这些问题都意味着从文件中读取数据、解决问题并将结果写入新文件,所以我想我会使用类似于Java.

中的 接口

我的 header 看起来像这样:

#include <iostream>

using namespace std;

class Problem {
public:
    /*
    * Read data from file.
    */
    virtual bool read(string filename) = 0;

    /*
     * Solve problem.
     */
    virtual void solve() = 0;

    /*
     * Write solution to file.
     */
    virtual bool write(string filename) = 0;
};

class Brothers : public Problem {};

我正在尝试在我的 Brothers.cpp 源文件中实现第一个函数,如下所示:

bool Brothers::read(string filename) override {...}

Brothers:: 部分外,如果我只有源文件,我通常会如何实现此功能。

我收到错误 Function 'read' was not declared in class 'Brothers'Function doesn't override any base member functions,我想了解为什么这种方法不起作用以及我应该怎么做。

即使您覆盖了基础 class 声明,与 java 不同,您仍然需要在派生的 class 的头文件中声明该函数。编译器只查看与该函数关联的 class,因此当您说 Brother 中有一个函数 read 而它看不到明确存在一个函数时,您会得到一个错误。
另一件事是,当您使用接口或其他抽象 classes 时,必须在存在非纯虚拟的 class 之前定义声明为纯虚拟的所有内容,因此在此示例中:

class A
{
    virtual void foo() = 0;
}

class B : public A
{
    virtual int bar()
    {
        return 0;
    }
}

class C : public B
{
    virtual void foo()
    {
        // Do something
    }
}

ClassA是抽象的,因为它有一个纯虚函数,但是B也是,因为它仍然没有foo()的定义。在没有它的定义之前,不可能有 non-abstract classes。