2015-06-20 113 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==將成爲所有派生類的虛函數的默認實現,除非它們用更具體的類覆蓋它。