Я пытаюсь перегрузить оператор shriek (!), Чтобы вернуть длину вектора следующим образом:
(! потому что это выглядит как строчная буква «L», и я хотел унарный оператор для краткости и удобочитаемости.)
// Vector class in Vector.h
class Vector {
public:
double x,y,z;
/* ... */
double operator ! (); /* Vector length */
/* ... */
}
// Function definition in Vector.cpp
double Vector::operator ! (){
return sqrt(x*x+y*y+z*z);
}
// Main function in main.cpp
#include "vector.h"int main (int argc, char** argv){
Vector a = Vector(1,2,3);
cout << !a << endl;
}
И код ошибки, который я получаю от gcc:
$ gcc -lstdc++ main.cpp
Undefined symbols for architecture ********:
"Vector::operator!()", referenced from:
_main in ********.o
ld: symbol(s) not found for architecture ********
collect2: ld returned 1 exit status
(Примечание: я не смог найти ответ на этот вопрос либо из-за неопытности в C ++, либо из-за того, что я пытаюсь сделать что-то, что нарушает базовый подход к языку, который я пропустил из-за самообразования.)
Компилятор жалуется, потому что он не знает, где определяется векторный метод. Попробуйте скомпилировать с g++ main.cpp Vector.cpp
,
Explination:
Чтобы ваш код работал должным образом, необходимо скомпилировать оба исходных файла, а затем скомпилированные объекты, связанные для создания окончательного исполняемого файла. Это то же самое, что и в C.
С C ++ (или C с gcc) вы можете компилировать отдельные файлы, используя:
g++ -c my_file_1.cpp -o my_file_1.o
g++ -c my_file_2.cpp -o my_file_2.o
Если вы компилируете файлы по отдельности, вам нужно связать файлы для создания исполняемого файла:
g++ my_file_1.o my_file_2.o -o a.out
Команда g++ main.cpp Vector.cpp
делает все это за один шаг и избавляет от необходимости создавать несколько объектных файлов (файлы с .o
расширение).
Каждый метод для компиляции нескольких файлов имеет свои преимущества. Например, компиляция исходных файлов обычно является одним из самых дорогостоящих упражнений в программировании. Если вы компилируете файлы по отдельности, вам нужно перекомпилировать объектные файлы только при изменении исходного файла, связанного с объектным файлом.
Ошибка в вашем вопросе была вызвана на этапе связывания (связывание выполняется, даже если у вас есть только 1 файл, если вы не используете -c
флаг). Ошибка в основном говорит о том, что компилятор имеет имя функции, но не может найти, где находится фактический скомпилированный код.
gcc
попробуйте использовать команду gcc -lstdc++ -lm main.cpp Vector.cpp
,a
в Vector a(1, 2, 3);
,Других решений пока нет …