一元运算符在C ++中重载类型(新手)

时间:2013-08-19 15:26:14

标签: c++ gcc compiler-errors operator-overloading unary-operator

我正在尝试重载尖叫(!)运算符以返回向量的长度,如下所示: (!因为它看起来像一个小写的“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 个答案:

答案 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);
  • 旨在让您的生活更轻松的计划是Make。可以设置Make以检查是否需要重建文件并运行构建可执行文件所需的所有命令。虽然这需要一些学习,但请看一下这篇文章(https://stackoverflow.com/a/2481326/2372604)。