如何在 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。
我对 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。