我正在尝试用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;
。我也试过声明指向该类的指针,但我没有成功。谢谢!
答案 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