簡體   English   中英

一元運算符在C ++中重載類型(新手)

[英]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
  • 另外要注意,你的聲明中更改aVector a(1, 2, 3);
  • 旨在讓您的生活更輕松的計划是Make。 可以設置Make以檢查是否需要重建文件並運行構建可執行文件所需的所有命令。 雖然確實需要一些學習,但請看一下這篇文章( https://stackoverflow.com/a/2481326/2372604 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM