在多个cpp文件C ++上使用类/ struct / union

时间:2011-09-27 00:56:31

标签: c++ class header struct include

我正在尝试用C ++创建一个类,并且能够在多个C ++文件中访问该类的元素。我已尝试过7种可能的senarios来解决错误,但一直没有成功。我已经研究过班级前瞻性声明,这似乎不是答案(我可能是错的)。

//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" (?jam@@3VJam@@A) already defined in stdafx.obj

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

我理解错误是多重定义,因为我在两个CPP文件中都包含resources.h。我怎样才能解决这个问题?我尝试在CPP文件中声明class Jam,然后为每个需要访问该类的CPP文件声明extern class Jam jam;。我也试过声明指向该类的指针,但我没有成功。谢谢!

5 个答案:

答案 0 :(得分: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 :(得分:1)

您宣布结构Jam 创建此类型的jam变量。链接器抱怨你有两个(或更多)称为jam的东西,因为你的头文件会导致每个.cpp文件声明它自己的一个。

要解决此问题,请将标头声明更改为:

class Jam{
public:
int age;
};

extern Jam jam;

然后将以下行放在.cpp来源的一个中:

Jam jam;

答案 2 :(得分: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;
}

答案 3 :(得分: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;
}

答案 4 :(得分:0)

使用pragma once指令或某些定义来确保标题不会在代码中包含多次。

使用pragma指令(example.h)的示例:

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

使用定义的示例(example.h):

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