1

悲鳴 (!) 演算子をオーバーロードして、次のようにベクトルの長さを返そうとしています: (! は小文字の「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++ の経験がないため、または自己教育のためにスキップした言語の非常に基本的なテナントに違反することをしようとしているために、この質問に対する答えを見つけることができませんでした。)

4

1 に答える 1

3

ベクトル メソッドが定義されている場所がわからないため、コンパイラは不平を言っています。でコンパイルしてみてください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は、これらすべてを 1 つのステップで実行するため、複数のオブジェクト ファイル (.o拡張子を持つファイル) を作成する必要がなくなります。

複数のファイルをコンパイルする方法には、それぞれ利点があります。たとえば、ソース ファイルのコンパイルは、通常、プログラミングで最も時間のかかる作業の 1 つです。ファイルを個別にコンパイルする場合は、オブジェクト ファイルに関連付けられたソース ファイルを変更するときにのみ、オブジェクト ファイルを再コンパイルする必要があります。

-cあなたの質問のエラーは、リンク段階で発生しました(フラグを使用しない限り、ファイルが1つしかない場合でもリンクが実行されます)。エラーは基本的に、コンパイラには関数の名前がありましたが、実際のコンパイルされたコードがどこにあるかを見つけることができなかったことを示していました。

  • どうしても使いたい場合はgcc、コマンドを使ってみてくださいgcc -lstdc++ -lm main.cpp Vector.cpp
  • 別の注意として、 の宣言を に変更してaくださいVector a(1, 2, 3);
  • あなたの人生を少し楽にするように設計されたプログラムは Make です。ファイルを再構築する必要があるかどうかを確認し、実行可能ファイルを構築するために必要なすべてのコマンドを実行するように Make をセットアップできます。ただし、この投稿 ( https://stackoverflow.com/a/2481326/2372604 ) をご覧ください。
于 2013-08-19T15:33:50.727 に答える