В моем проекте C ++ у меня есть ряд констант, к которым я хочу получить доступ из разных классов. Я поместил их все в файл .h, который я назвал constants.h (я не уверен, что это лучшая идея, но это помогло мне сохранить сортировку)
Теперь у меня есть проблема, что, если я включаю это в более чем один файл cpp, я получаю ошибки LNK2005:
------ Началась сборка: Проект: testMy3Dpoints, Конфигурация: Отладка Win32 ------
Компиляция ...
testMy3Dpoints.cpp
Связывание ...
CalculayDotproduct.obj: ошибка LNK2005: «int myint» (? myint @@ 3HA) уже определено в TestMy3Dpoints.obj
CalculateDotproduct.obj: ошибка LNK2005: «класс v3d vect2» (? vect2 @@ 3Vv3d @@ A) уже определен в testMy3Dpoints.obj
calculateDotproduct.obj: ошибка LNK2005: «класс 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;
}
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;