gpt4 book ai didi

c++ - 如何定义项目范围的常量或如何使我自己的类的成员函数在 C++ 中接受 const 对象

转载 作者:行者123 更新时间:2023-11-30 03:07:40 24 4
gpt4 key购买 nike

在我的 C++ 项目中,我有许多要从不同类访问的常量。我将它们全部放入我命名为 constants.h 的 .h 文件中(我不确定这是否是最好的主意,但它帮助我整理了东西)现在我遇到了问题,如果我将它包含在多个 cpp 文件中,我会收到 LNK2005 错误:

------ Build started: Project: testMy3Dpoints, Configuration: Debug Win32 ------ Compiling...
testMy3Dpoints.cpp
Linking...
calculateDotproduct.obj : error LNK2005: "int myint" (?myint@@3HA) already defined in TestMy3Dpoints.obj
calculateDotproduct.obj : error LNK2005: "class v3d vect2" (?vect2@@3Vv3d@@A) already defined in testMy3Dpoints.obj
calculateDotproduct.obj : error LNK2005: "class v3d vect1" (?vect1@@3Vv3d@@A) already defined in testMy3Dpoints.obj
D:\3D mapping\visual studio projects\testMy3Dpoints\Debug\testMy3Dpoints.exe : fatal error LNK1169: one or more multiply defined symbols found

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

计算点积.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;
}

常量.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;

(请注意,一般来说全局变量是不受欢迎的)。

关于c++ - 如何定义项目范围的常量或如何使我自己的类的成员函数在 C++ 中接受 const 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5663158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com