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

Posted

技术标签:

【中文标题】C++ 中的一元运算符重载类型(新手)【英文标题】:Unary operator overloading types in C++ (newbie) 【发布时间】:2013-08-19 15:26:13 【问题描述】:

我正在尝试重载尖叫 (!) 运算符以返回向量的长度,如下所示: (!因为它有点像小写的“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.cpp了。 使用 g++ 代替 gcc 你在vector.cpp里面有#include "vector.h"吗? 【参考方案1】:

编译器抱怨,因为它不知道向量方法是在哪里定义的。尝试使用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://***.com/a/2481326/2372604)。

【讨论】:

谢谢!这确实有帮助,但我不确定我是否完全理解这有帮助的原因——编译器不是查看了我包含的所有文件并推断出vector.cpp 是要查看的正确文件吗?如果我有很多文件,我可以看到这是一个问题/麻烦,而这在 C 中似乎从来都不是问题。 @eratosthenesia 编译器只编译你告诉它编译的东西。包含vector.h 并不意味着编译器会搜索vector.cpp 文件。

以上是关于C++ 中的一元运算符重载类型(新手)的主要内容,如果未能解决你的问题,请参考以下文章

C++重载运算符

一元运算符重载

重载 +/- 一元运算符

运算符重载

十个 C++ 运算符重载示例,看完不懂打我...

十个 C++ 运算符重载示例,看完不懂打我...