2015-06-20 235 views
0

这是我的代码的一部分:C++构造错误

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

和.cpp文件

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

我得到这个编译错误:在.h文件 宣言

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 ==' 

请帮忙。 谢谢

+7

我没有看到构造函数...? –

+0

该类是抽象的,所以删除= 0位 –

+0

所以...为什么你把'= 0'在运算符声明? – AnT

回答

2

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

不能实例化抽象类

派生类的抽象File类可以实现此功能,并且可以被实例化。

+0

如果您尝试重现确切的错误消息(它是MSVC),你会发现OP对派生类“目录”有问题。 – Christophe

1

显然它是一个复制粘贴错误在你的最后。删除=0,你很好去。

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

+1

而在这种情况下,也是'Directory :: operator =='而不是'File :: operator ==''--) – Christophe

0

错误信息是什么意思?

你MSVC的错误消息对应于你从一个抽象类File派生类Directory精确的情况下:

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

编译器解释你,你已经从一个抽象的成员函数继承,是不是重写你的新类:

1>布尔文件::运算符==(const的文件&)常量“:是抽象 1> C:\用户\ talw \桌面\ hw5 \ hw5 \ PROJECT1 \文件。 h(57):见
'File :: operator =='的声明

如何解决?

为了使您的目录类的具体类,则必须先在类中重写它宣布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,那么你只需要删除=0operator==在类定义。然后File::operator==将成为所有派生类的虚函数的默认实现,除非它们用更具体的类覆盖它。