如何定义项目范围的常量或如何使我自己的类'memberfunction接受c ++中的const对象

时间:2011-04-14 12:22:51

标签: c++ class const definition linker-errors

在我的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;

1 个答案:

答案 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;

(请注意,通常全局变量不受欢迎)。