2011-09-27 88 views
2

我想在C++中創建一個類,並且能夠在多個C++文件中訪問該類的元素。我嘗試了超過7種可能的senarios來解決這個錯誤,但一直不成功。我已經看過類似的前瞻性聲明,這似乎不是答案(我可能是錯的)。在多個cpp文件中使用類/結構體/聯合C++

//resources.h 
class Jam{ 
public: 
int age; 
}jam; 

//functions.cpp 
#include "resources.h" 
void printme(){ 
std::cout << jam.age; 
} 

//main.cpp 
#include "resources.h" 
int main(){ 
printme(); 
std::cout << jam.age; 
} 

Error 1 error LNK2005: "class Jam jam" ([email protected]@[email protected]@A) already defined in stdafx.obj

Error 2 error LNK1169: one or more multiply defined symbols found

我理解的錯誤是一個多definiton因爲我包括這兩個cpp文件resources.h。我怎樣才能解決這個問題?我曾嘗試在CPP文件中聲明class Jam,然後爲每個需要訪問該類的CPP文件聲明extern class Jam jam;。我也嘗試過向班級宣佈指示,但是我一直不成功。謝謝!

回答

1

變量jam的定義H文件,並且包含在多個CPP類中,這是一個問題。

變量不應該在H文件中聲明,以避免出現這種情況。將類定義保留在H文件中,但在CPP文件的一個中定義變量(並且如果需要全局訪問它 - 在其餘所有內容中將其定義爲extern)。

例如:

//resources.h 
class Jam{ 
public: 
int age; 
}; 
extern Jam jam; // all the files that include this header will know about it 

//functions.cpp 
#include "resources.h" 
Jam jam; // the linker will link all the references to jam to this one 
void printme(){ 
std::cout << jam.age; 
} 

//main.cpp 
#include "resources.h" 
int main(){ 
printme(); 
std::cout << jam.age; 
} 
1

您正在聲明結構Jam創建了一個名爲jam的變量。鏈接器抱怨說你有兩個(或更多)東西叫jam,因爲你的頭文件會導致每個文件都聲明自己的文件。

爲了解決這個問題,你的頭聲明更改爲:

class Jam{ 
public: 
int age; 
}; 

extern Jam jam; 

,然後將下面一行在你.cpp來源一個

Jam jam; 
2

你需要你的定義從聲明中分離出來。使用:

//resources.h 
class Jam{ 
public: 
int age; 
}; 
// Declare but don't define jam 
extern Jam jam; 

//resources.cpp 
// Define jam here; linker will link references to this definition: 
Jam jam; 
1

作爲第一步,您應該分開類的定義和實例的聲明。然後在resources.h中使用extern並在CPP中聲明該實例。

像這樣:

//resources.h 
class Jam{ 
public: 
    int age; 
}; 

extern Jam jam; 

//functions.cpp 
#include "resources.h" 
void printme(){ 
    std::cout << jam.age; 
} 

//main.cpp 
#include "resources.h" 
Jam jam; 

int main(){ 
    printme(); 
    std::cout << jam.age; 
} 
0

使用編譯一次指令,或者一些定義,以確保頭不會被包含不止一次在你的代碼。

實施例使用編譯指令(example.h文件):

#pragma once 
// Everything below the pragma once directive will only be parsed once 
class Jam { ... } jam; 

實施例使用定義(示例。h):

#ifndef _EXAMPLE_H 
#define _EXAMPLE_H 
// This define makes sure this code only gets parsed once 
class Jam { ... } jam; 
#endif