我正在尝试重载shriek(!)运算符,以返回 vector 的长度,如下所示:
(!因为它看起来像一个小写的“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++的缺乏经验,或者因为我试图做的事情违反了由于自我教育而跳过的语言的一个非常基本的租户,所以我找不到此问题的答案。)

最佳答案

编译器抱怨是因为它不知道vector方法的定义位置。尝试使用g++ main.cpp Vector.cpp进行编译。

说明:
为了使代码按预期工作,需要对两个源文件都进行编译,然后将编译后的对象链接起来以创建最终的可执行文件。这与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);
  • 一个旨在让您的生活更轻松的程序是Make。可以设置Make来检查是否需要重建文件,并运行生成可执行文件所需的所有命令。不过,确实需要一些学习,请看一下这篇文章(https://stackoverflow.com/a/2481326/2372604)。
  • 关于c++ - C++中的一元运算符重载类型(新手),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18317514/

    10-11 22:13
    查看更多