[英]Unary operator overloading types in C++ (newbie)
我正在嘗試重載尖叫(!)運算符以返回向量的長度,如下所示:(!因為它看起來像一個小寫的“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 ++經驗,或者因為我試圖做一些違反我自我教育而忽略的語言的基本租戶,我無法找到這個問題的答案。)
編譯器抱怨,因為它不知道向量方法的定義位置。 嘗試使用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);
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.