我正在尝试重载尖叫(!)运算符以返回向量的长度,如下所示: (!因为它看起来像一个小写的“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 ++经验,或者因为我试图做一些违反我自我教育所忽略的语言的基本承租人的事情,我找不到这个问题的答案。 )
答案 0 :(得分:3)
编译器抱怨,因为它不知道向量方法的定义位置。尝试使用g++ main.cpp Vector.cpp
进行编译。
<强> Explination:强> 为了使代码按预期工作,需要编译源文件,然后链接编译对象以创建最终可执行文件。这与C中的相同。
使用C ++(或带有gcc的C语言),您可以使用以下命令编译单个文件:
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);
。