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

时间:2018-03-27 17:13:58

标签: c++ interface header-files abstraction

我对C和Java非常有信心并且刚刚开始使用C ++,仍然习惯了有关最佳实践的基础知识,包括数据抽象(据我所知,这意味着正确的标头使用)。

我想制作一个解决不同类型问题的项目,这些问题都意味着从文件中读取数据,解决问题并将结果写入新文件,所以我想我会使用类似于<的东西Java中的strong> interface 。

我的标题如下:

#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,我想了解为什么这种方法不起作用以及我应该做些什么。

1 个答案:

答案 0 :(得分:0)

即使你重写了基类声明,与java不同,你仍然需要在派生类的头文件中声明该函数。编译器只查找与该函数关联的类,因此当您说read中有一个函数Brother并且它无法看到明确存在一个函数时,您会收到错误。
另一件事是当你使用接口或其他抽象类时,必须在有一个非纯虚拟的类之前定义声明为纯虚拟的所有东西,所以在这个例子中:

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

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

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

A是抽象的,因为它具有纯虚函数,但B也是如此,因为它仍然没有foo()的定义。在有定义之前,不能有非抽象类。