2013-11-21 139 views
0

首先,不好意思問這樣一個愚蠢的問題。我覺得很有趣,我很好奇,知道爲什麼。我有一個虛析構函數的基類Base.h爲什麼CPP文件名必須與H文件名相符?

#ifndef BASE_H_ 
#define BASE_H_ 

class Base { 
public: 
    Base(); 
    virtual ~Base(); 
}; 
#endif 

申報然後,我有一個兒童類繼承的基類中聲明Child.h

#ifndef CHILD_H_ 
#define CHILD_H_ 

#include "base.h" 
class Child : public Base { // (1) 
    public: 
     Child(); 
}; 
#endif 

現在做一個main.cpp,放在了實現Base類的虛擬析構函數。

#include "Base.h" 

Base::Base() {} 
Base::~Base() {} 

源代碼是在Ubuntu 13.04中使用Eclipse C++ Kepler編譯的。抱怨undefined reference to 'Base::Base()'(1)有錯誤。如果我將main.cpp更改爲Base.cpp,則錯誤將消失。

我可以知道爲什麼會發生這種情況嗎?這是由於Eclipse中的配置?如果是,我可以關閉此功能嗎?或者這是由於最好的編程實踐,使源代碼更易於管理?或者這是一個C++規範?

回答

1

標準中沒有規定這不應該起作用,我也不認爲eclipse強制執行此佈局。這確實更容易管理和普遍,但決不是一項要求。

您可能沒有將main.cpp添加到構建中,它不會被編譯。

+1

此外,如果您使用多個源文件來實現某個類,則無法滿足此限制。 –

1

這有什麼都沒有與C++規範。它必須在Eclipse中,也許在makefile中。你總是可以將一條簡單的單行從main.cpp中分出來(與#include一起)以保留在那裏,並將剩下的放在Base.cpp中。

相關問題