2011-05-08 94 views
0

另一個文件我不能實例化一個類這項工作C++不能從main.cpp中

Addr.h

#ifndef ADDR_H 
#define ADDR_H 

class Foo{ 
public: 
    Foo();     // function called the default constructor 
    Foo(int a, int b); // function called the overloaded constructor 
    int Manipulate(int g, int h); 

private: 
    int x; 
    int y; 
}; 

#endif 

Addr.cpp

#include "addr.h" 


Foo::Foo(){ 
    x = 5; 
    y = 10; 
} 
Foo::Foo(int a, int b){ 
    x = a; 
    y = b; 
} 

int Foo::Manipulate(int g, int h){ 
    return x = h + g*x; 
} 

的main.cpp

#include "addr.cpp" 

int main(){ 
    Foo myTest = Foo(20, 45); 
    while(1){} 
    return 0; 
} 

我在做什麼錯?我得到這些鏈接器錯誤:

錯誤LNK2005:「public:int __thiscall Foo :: Manipulate(int,int)」(?Manipulate @ Foo @@ QAEHHH @ Z)已經在addr.obj中定義了c:\ Users \基本文件\ visual studio 2010 \項目\控制檯測試\控制檯測試\ main.obj

錯誤LNK2005:「public:__thiscall Foo :: Foo(int,int)」(?? 0Foo @@ QAE @ HH @ Z)已在addr.obj中定義c:\ Users \ christian \ documents \ visual studio 2010 \ Projects \ Console Test \ Console Test \ main.obj

error LNK2005:「public:__thiscall Foo :: Foo(void) 「(?? 0Foo @@ QAE @ XZ)已經在addr.obj中定義了c:\ Users \ christian \ documents \ visual studio 2010 \ Projects \ Console Test \ Console Test \ main.obj

錯誤LNK1169:一個或多個多重定義符號找到C:\ Users \用戶基督教\文檔\ Visual Studio 2010的\項目\控制檯測試\發佈\控制檯將Test.exe

我希望任何形式的幫助! !

回答

2
#include "addr.cpp" 

你包括.cpp文件到您的main.cpp,這是造成問題的原因。您應該包含頭文件,而不是,如:

#include "addr.h" //add this instead, to your main.cpp 

因爲它含有定義類Foo其頭文件。

+1

謝謝^^,我沒有注意到:d – Christian 2011-05-08 18:40:50

1

在main.cpp中,應該包含頭文件,而不是cpp文件。

變化

#include "addr.cpp" 

#include "addr.h" 
1

main.cpp

#include "addr.cpp" 

應該

#include "addr.h" 

如果#include "addr.cpp",就可以編譯main.cpp(甚至它鏈接到它自己的可執行文件),但是當你鏈接main.objadd.obj,你會得到一個重複的定義錯誤,因爲類Foo現在完全定義兩個對象文件。

+0

榮譽給你太多!:)我沒想到會得到一個快速的答案! – Christian 2011-05-08 18:41:30

+0

織補。你打了我大約30秒 – matzahboy 2011-05-09 01:46:12

0

您可以#include「addr.h」(如前所述),或者讓構建系統不編譯addr.cpp。前者通常是首選,但後者也可以解決問題,並且通常與自動代碼生成工具的輸出一起使用。

0

有獲取類數據到main.cpp中的兩種方式

1)包括在main.cpp中文件頭文件「addr.h」,那麼現在你有類成員函數'定義,但沒有實現部分。所以在編譯時,代碼應該是: g++ addr.cpp main.cpp

2)在main.cpp中包含cpp文件「addr.cpp」,所以您自動將定義也作爲「addr.h」包含在「addr.cpp」中。現在,您只能編譯main.cpp文件:g++ main.cpp

第一種方法是標準的,是維護模塊化和封裝良好的編程習慣......