Как определить константы всего проекта или как заставить функцию-член моего собственного класса принимать константные объекты в c ++ - PullRequest
1 голос
/ 14 апреля 2011

В моем проекте 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;

1 Ответ

3 голосов
/ 14 апреля 2011

Объект с внешней связью должен быть определен один раз.В

v3d vect1(1, 2, 3.14);

vect1 имеет внешнюю связь.Так что вам нужно будет использовать

extern V3d vect1;

в .h, а затем

v3d vect1(1, 2, 3.14);

в one .cpp.Существует специальное правило, которое позволяет

const int myint = 3;

иметь внутреннюю связь, если она никогда не используется в качестве lvalue, что может произойти неожиданно, когда она подается в качестве ссылочного параметра или в нечто вроде:

x = v ? myint : myint2;

(Обратите внимание, что в общем случае глобальные переменные не одобряются).

...