在我的C++项目中,我有许多常量,我想从不同的类中访问。我将它们全部放入一个名为constants.h的.h文件中(我不确定这是否是最好的主意,但这有助于我进行排序)
现在,我遇到了一个问题,如果我将其包含在多个cpp文件中,则会出现LNK2005错误:



当我只使用整数时,将所有变量定义为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;

(请注意,通常不赞成使用全局变量)。

10-06 07:10