如何定义项目范围的常量或如何使自己的类的成员函数在c ++中接受const对象
||
在我的C ++项目中,我有许多要从不同类访问的常量。我将它们全部放入一个名为constants.h的.h文件中(我不确定这是否是最好的主意,但这有助于我进行排序)
现在,我遇到的问题是,如果我将其包含在多个cpp文件中,则会出现LNK2005错误:
------开始构建:项目:testMy3Dpoints,配置:Win32调试------
编译中...
testMy3Dpoints.cpp
连结中...
computeDotproduct.obj:错误LNK2005:\“ int myint \”(?myint @@ 3HA)已在TestMy3Dpoints.obj中定义
computeDotproduct.obj:错误LNK2005:\“ class v3d vect2 \”(?vect2 @@ 3Vv3d @@ A)已在testMy3Dpoints.obj中定义
computeDotproduct.obj:错误LNK2005:\“ class v3d vect1 \”(?vect1 @@ 3Vv3d @@ A)已在testMy3Dpoints.obj中定义
D:\\ 3D映射\\ Visual Studio项目\\ 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;
}
计算点产品
#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;
}
常数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;
没有找到相关结果
已邀请:
1 个回复
藐刚
vect1具有外部链接。所以你必须使用
在.h然后
在一个.cpp中有一个特殊的规则
如果从未将其用作左值,则具有内部链接,这可能会意外发生,将其作为参考参数或类似方式进行输入:
(请注意,通常不赞成使用全局变量)。