gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:53:05 25 4
gpt4 key购买 nike

我正在尝试重载尖叫 (!) 运算符以返回 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com