1

我试图重载尖叫(!)运算符以返回向量的长度,如下所示:(!因为它看起来像一个小写的“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++ 经验,要么是因为我试图做一些违反我因自学而跳过的语言的一个非常基本的租户的事情。)

4

1 回答 1

3

编译器抱怨,因为它不知道向量方法是在哪里定义的。尝试使用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
  • 另请注意,将您的声明更改aVector a(1, 2, 3);
  • 一个旨在让您的生活更轻松的程序是 Make。可以设置 Make 以检查是否需要重建文件并运行构建可执行文件所需的所有命令。不过,这确实需要一些学习,看看这篇文章(https://stackoverflow.com/a/2481326/2372604)。
于 2013-08-19T15:33:50.727 回答