在我的C ++项目中,我有许多常量,我想从不同的类访问。我将它们全部放入我命名为constants.h的.h文件中(我不确定这是不是最好的主意,但它帮助我保持排序) 现在我遇到了问题,如果我将其包含在多个cpp文件中,我会收到LNK2005错误:
------ Build build:Project:testMy3Dpoints,Configuration:Debug Win32 ------ 编译...
testMy3Dpoints.cpp
链接...
calculateDotproduct.obj:错误LNK2005:已在TestMy3Dpoints.obj中定义的“int myint”(?myint @@ 3HA)
calculateDotproduct.obj:错误LNK2005:“class v3d vect2”(?vect2 @@ 3Vv3d @@ A)已经在testMy3Dpoints.obj中定义了
calculateDotproduct.obj:错误LNK2005:“class v3d vect1”(?vect1 @@ 3Vv3d @@ A)已经在testMy3Dpoints.obj中定义了
D:\ 3D mapping \ visual studio projects \ testMy3Dpoints \ Debug \ testMy3Dpoints.exe:致命错误LNK1169:找到一个或多个多重定义的符号
当我只使用整数时,将所有变量定义为const会使这些错误消失,程序编译并运行正常。 但是,自从我开始引入作为我的类v3d的对象的常量时,这会产生不同的错误: 错误C2662:'v3d :: dotProduct':无法将'this'指针从'const v3d'转换为'v3d&'转换失去限定符 显然它不喜欢cons v3d变量(常量)。我定义成员函数v3d :: dotProduct的方式有什么不对吗?
这是我的代码:
testMy3Dpoints.cpp
#include "stdafx.h"
#include <iostream>
#include "v3d.h"
#include "constants.h"
#include "calculateDotproduct.h"
int _tmain(int argc, _TCHAR* argv[])
{
double dp = vect1.dotProduct(vect2);
std::cout << "myint: " << myint << std::endl;
std::cout << "vect1.x " << vect1.x << ", vect1.y " << vect1.y << ", vect1.z " << vect1.z << std::endl;
std::cout << "vect2.x " << vect2.x << ", vect2.y " << vect2.y << ", vect2.z " << vect2.z << std::endl;
std::cout << "dp = " << dp << std::endl;
alsoCalculateDotProduct();
return 0;
}
calculateDotproduct.h
#pragma once
void alsoCalculateDotProduct(
calculateDotproduct.cpp
#include "stdafx.h"
#include <iostream>
#include "v3d.h"
#include "constants.h"
#include "calculateDotproduct.h"
void alsoCalculateDotProduct()
{
double mydp = vect1.dotProduct(vect2);
std::cout << "vect1.x " << vect1.x << ", vect1.y " << vect1.y << ", vect1.z " << vect1.z << std::endl;
std::cout << "vect2.x " << vect2.x << ", vect2.y " << vect2.y << ", vect2.z " << vect2.z << std::endl;
std::cout << "mydp = " << mydp << std::endl;
return;
}
v3d.h:
#pragma once
class v3d
{
public:
double x;
double y;
double z;
v3d(double a, double b, double c);
void set(double a, double b, double c);
double dotProduct(v3d vector);
};
v3d.cpp:
#include "stdafx.h"
#include "v3d.h"
void v3d::set(double a, double b, double c)
{
x=a;
y=b;
z=c;
}
v3d::v3d(double a, double b, double c)
{
set(a,b,c);
}
double v3d::dotProduct(v3d vector)
{
return x*vector.x + y*vector.y + z*vector.z;
}
constants.h
#pragma once
#include "v3d.h"
const v3d vect1(1, 2, 3.14);
const v3d vect2(4, 1.5, 0);
const int myint = 3;
分别
#pragma once
#include "v3d.h"
v3d vect1(1, 2, 3.14);
v3d vect2(4, 1.5, 0);
int myint = 3;
答案 0 :(得分:3)
具有外部链接的对象必须定义一次。在
v3d vect1(1, 2, 3.14);
vect1有外部联系。所以你必须使用
extern V3d vect1;
<。>在.h然后
v3d vect1(1, 2, 3.14);
在一个 .cpp中。
有一个特殊的规则const int myint = 3;
如果它从未被用作左值,则具有内部链接,这可能会意外地发生,它被作为参考参数或类似的东西:
x = v ? myint : myint2;
(请注意,通常全局变量不受欢迎)。