C ++构造函数bug

时间:2015-06-20 07:04:08

标签: c++ constructor compiler-errors abstract-class declaration

这是我的代码的一部分: .h文件中的声明:

virtual bool operator==(const File& file) const = 0;

和.cpp文件

bool File::operator==(const File& file) const {
    return true;
}

我收到此编译错误:

 1>c:\users\talw\desktop\hw5\hw5\project1\main.cpp(76): error C2259: 
              'Directory' : cannot instantiate abstract class
 1>          due to following members:  
 1>          'bool File::operator ==(const File &) const' : is abstract
 1>          c:\users\talw\desktop\hw5\hw5\project1\file.h(57) : see  
              declaration of 'File::operator =='

请帮忙。 感谢

3 个答案:

答案 0 :(得分:2)

这是一个纯虚拟运算符重载,使您的类抽象,因此您可以在同一个类中使用函数实现,但无法实例化一个给出以下错误的抽象类。

  

无法实例化抽象类

抽象File类的派生类可以实现此函数并可以实例化。

答案 1 :(得分:1)

显然,你的复制粘贴错误。删除=0,你就可以了。

它导致您的Directory类成为抽象基类,因此您无法拥有它的实例。

答案 2 :(得分:0)

错误消息的含义是什么?

您的MSVC错误消息对应于从抽象类Directory派生类File的确切情况:

1>c:\users\talw\desktop\hw5\hw5\project1\main.cpp(76): error C2259: 
              'Directory' : cannot instantiate abstract class
1>          due to following members:  

编译器向您解释说,您继承自新类中未覆盖的抽象成员函数:

1> 'bool File :: operator ==(const File&)const':是抽象的 1 GT; c:\ users \ talw \ desktop \ hw5 \ hw5 \ project1 \ file.h(57):见
              声明'File :: operator =='

如何解决?

要使您的Directory类成为具体类,必须先在类中声明operator==以覆盖它(请注意关键字override是可选的):

class Directory : public File {
//...
public: 
    bool operator==(const File& file) const override ;
};

然后你将提供DERIVED类的定义:

bool Directory::operator==(const File& file) const {
    return true;
} 

这是唯一的解决方案吗?

但是,如果你的意图是真正定义类File的虚函数,那么你只需要删除类定义中=0的{​​{1}}。 operator==将成为所有派生类的虚函数的默认实现,除非它们使用更具体的类重写它。