1

こんにちは、私は c++ で小さなプロジェクトを書いています。そこでは、いくつかの作業を行ういくつかのクラスが必要です。インターフェイスとクラスの実装を作成しました。

私を驚かせたのは、main() なしでは単純なクラスを持つことができないということです. 一度インスタンス化されたクラスが欲しいです. メソッドは呼び出すことができます.クラス実装の main()。これは、私が持ちたいものの頭の中にある例です。

ファイル animal.h:

class animal
{
 public: 
   animal();
  ~animal();

 public:
   int method1(int arg1);

 private:
   int var1;
};

ファイル animal.cpp:

#include "animal.h"

animal::animal(){...}
animal::~animal(){...}
int animal::method1(int arg1){return var1;}
}

そして、別のファイルから動物クラスを呼び出して、次のように動作させたいと思います: app.cpp ファイル:

#include <neededlib>
#include "animal.h"

int main()
{
 animal dog;
 cout << dog.method1(42);
 return 0;
}

しかし、コンパイラは私に与えます

/usr/lib/gcc/i686-pc-linux-gnu/4.3.3/../../../crt1.o: In function _start:

"(.text+0x18): undefined reference to `main`"

collect2: ld returned 1 exit status 

animal.cppの場合、そこにメインは必要ありませんか、それとも必要ですか?

どこが間違っていますか?

4

5 に答える 5

19

しかし、クラスの実装に main() は必要ありません (したくもありません)。

関数mainはエントリポイントです。そこから実行が始まります。そのような関数を 1 つだけ持つ必要があります。

しかし、コンパイラはanimal.cppの「メインへの未定義の参照」を私に与えますが、そこにメインは必要ありませんか、それとも必要ですか?

今、あなたの問題はコンパイルされた形式のと をリンクしていないようです。app.cppanimal.cpp

私はメイクファイルにあまり強くありません。 g++ animal.h -o animal や g++ animal.cpp のようなものを使用しましたが、上記のエラーが表示されます

ヘッダーをコンパイルしません。したがって、使用しないでください:g++ animal.h

animal.cpp を個別にコンパイルすると、g++ によってオブジェクト ファイルが作成されました。app.cppが必要なため、 もコンパイルする必要がありますmain。ファイルをコンパイルしたら、以前に作成したオブジェクト ファイルapp.cppとリンクする必要があります。animalしかし、これらがリンクされていない場合、特に、main関数を含むファイルで、現在発生しているエラーが発生します。

ただし、g++上で説明したことを処理します。次のようなことを試してください:

g++ animal.cpp app.cpp -o test

これにより、実行可能ファイルが作成されtest、次を使用してアプリケーションを実行できます。

./test
于 2009-03-19T20:18:55.487 に答える
6

まず、これは間違っています:animal dog = new animal();

どちらかが必要です

animal * dog = new animal();
cout << dog->method1(42);
delete animal;

またはできればちょうど

animal dog;

次に、2 つのソース .cpp ファイルをコンパイルして生成されたオブジェクト ファイルをリンクする必要があります。

gcc -o animal animal.cpp app.cpp 

gcc を使用している場合は、うまくいくはずです。

于 2009-03-19T20:24:49.510 に答える
4

それらを一緒に (1 つのg++コマンドで) コンパイルするか、両方をオブジェクト ファイルにコンパイルし ( g++ -c)、 を使用ldしてオブジェクト ファイルをリンクする必要があります。

サンプル Makefile:

all: app.exe

app.exe: app.o animal.o
    g++ -o app.exe app.o animal.o

app.o: app.cpp
    g++ -c -o app.o app.cpp

animal.o: animal.cpp animal.h
    g++ -c -o animal.o animal.cpp
于 2009-03-19T20:19:36.560 に答える
1
class animal
{
 public: 
   animal();
  ~animal();

 public:
   method1(int arg1);

 private:
   int var1;
};

クラス宣言の最後にセミコロンを付けていないことに注意してください。C++ ではこれが必要であり、忘れると紛らわしい/誤解を招くエラー メッセージが表示されることがあります。

于 2009-03-19T20:31:11.180 に答える
0
 public:
   method1(int arg1);

method1 の戻り値の型がありません。みたいな意味でしたか

   int method1(int arg1);
于 2009-03-21T02:21:31.657 に答える