2011-09-27 226 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