2013-07-05 64 views
6

我有一個問題,從我的主類中的類對象訪問一個函數。我只是試圖爲該類創建對象並使用該對象來訪問該類的.cpp文件中的函數。我一直收到一個錯誤,我甚至做了最簡單的程序來測試它,但仍然出現錯誤。C++類沒有任何成員

主營:

#include <iostream> 
#include "Attack.h" 

using namespace std; 

int main() 
{ 
    Attack attackObj; 
    attackObj.printShiz(); 
} 

類的頭

#ifndef ATTACK_H 
#define ATTACK_H 

class Attack 
{ 
    public: 
     Attack(); 
     void printShiz(); 
    protected: 
    private: 
}; 

#endif // ATTACK_H 

類的.cpp

#include <iostream> 
#include "Attack.h" 
using namespace std; 

Attack::Attack(){ 

} 

void Attack::printShiz(){ 
    cout << "Test" << endl; 
} 

如何解決這個問題?每當我嘗試通過使用main中的對象來訪問Attack類中的printShiz函數時,我得到一個錯誤,並且它不認爲此類函數存在於此類中。

錯誤:

error: 'class Attack' has no member named 'printShiz' 
+1

代碼看起來不錯。也許它試圖使用舊版本的標題。 – chris

+3

有時候「重建所有」會修復所有問題。 – johnchen902

+0

剛剛嘗試過,得到相同的錯誤:/ – Rapture686

回答

0

你記得包括在主要的大括號?

#include <iostream> 
#include "Attack.h" 

using namespace std; 

int main() 
{ 
    Attack attackObj; 
    attackObj.printShiz(); 
} 
+0

是的,在那裏,我只是不小心將它從帖子中刪除。 – Rapture686

-1

嘗試定義的功能右到頭部

#ifndef ATTACK_H 
#define ATTACK_H 

class Attack { 
    public: 
     Attack(){}; 
     void printShiz(){}; 
    protected: 
    private: }; 

#endif // ATTACK_H 

和編譯。如果編譯器沒有抱怨重複的定義,它意味着你忘記編譯Class.cpp文件,那麼你只需要這樣做(將它添加到你的Makefile/project/solution ...你正在使用哪個工具鏈?)

+0

我正在使用的工具鏈是mingw32-g ++。exe – Rapture686

+0

你是如何編譯它的?向我們發送命令行 – doctorlove

+1

如果他「忘記編譯Class.cpp」會給出未定義的引用鏈接錯誤,而不是顯示的編譯錯誤 –

10

我有類似的問題。事實證明,我從一箇舊文件夾中包含了一個同名的舊頭文件。我刪除了舊文件,改變了#include指令來指向我的新文件,並且都很好。

+0

這是問題的正確答案。它有時會發生。您將頭文件複製到另一個路徑並對其進行更改,但由於項目中的某處包含舊頭,因此對成員函數,變量等的更改永遠不會出現,並且會出現這種「奇怪的」錯誤。 –

-1

我知道這已經一歲了,但我剛剛遇到了同樣的問題。我的問題是我的實現文件中沒有構造函數。我認爲這裏的問題可能是在#endif之後頭文件末尾的註釋標記...

0

您在.h中有錯字嗎?我曾遇到過這個錯誤,當我在我的main中正確調用了方法時,卻遇到了.h/.cpp中的拼寫錯誤(方法名稱中的「g」與「q」,這使得很難找到)。 它屬於「複製/粘貼錯誤」類別。

0

我找不到問題的答案,所以我嘗試了,沒有錯誤。

我編譯成這樣的:

g++ -c class.cpp

g++ -c main.cpp

g++ -o main class.o main.o

沒有錯誤,做工不錯。 用於編譯的gcc版本。 gcc版本4.1.2 20080704(紅帽4.1.2-46)

相關問題