如何定义项目范围的常量或如何使自己的类的成员函数在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;
    
已邀请:
具有外部链接的对象必须定义一次。在
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;
(请注意,通常不赞成使用全局变量)。     

要回复问题请先登录注册