gcc — Типы перегрузки унарных операторов в C ++ (новичок)

Я пытаюсь перегрузить оператор 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 ++, либо из-за того, что я пытаюсь сделать что-то, что нарушает базовый подход к языку, который я пропустил из-за самообразования.)

1

Решение

Компилятор жалуется, потому что он не знает, где определяется векторный метод. Попробуйте скомпилировать с 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);,
  • Программа, созданная, чтобы сделать вашу жизнь немного проще — Make. Можно настроить Make, чтобы проверить, нужно ли перестраивать файлы, и выполнить все команды, необходимые для сборки вашего исполняемого файла. Это требует некоторого изучения, хотя, посмотрите на этот пост (https://stackoverflow.com/a/2481326/2372604).
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]