3

私はJavaプログラマーであり、C++プログラミングは初めてです。Javaでは、すべてのクラスを別々のファイルに書き込む必要があり、すべてのメソッドの定義はクラス内にあります。しかし、C ++では、なぜC++でプログラマーがクラスの外部でメソッドの定義を記述できるのか疑問に思います。JavaのようなC++プログラムを書く方法はありますか?

4

2 に答える 2

6

必要に応じて、ヘッダーファイル内にクラスのコードを記述できます。これにより、C++のヘッダーファイルはjavaのjavaファイルと同様になります。

MyClass.h

#ifndef _MYCLASS_H_
#define _MYCLASS_H_

#include "OtherClass.h"

class MyClass {
public:
    MyClass() { _otherClass=0; }

    void set(OtherClass* oc) { _otherClass = oc; );
    OtherClass* get(void) { return _otherClass; };

private:
   OtherClass* _otherClass;
};
#endif

ただし、C++ではヘッダーとコードを2つのファイルに分割することもできます。これにより、メソッドの定義と宣言を分離し、コンパイル時のヘッダーの依存関係を減らすことができます。

上記の例では、MyClass.hを含むクラスには、必要かどうかに関係なく自動的にOtherClass.hが含まれ、OtherClass.hに変更を加えるには、MyClass.hのすべてのクライアントを再コンパイルする必要があることに注意してください。

ただし、以下の別の例では、OtherClass.hの前方宣言があり(これはポインターとしてのみ使用されるため可能です)、実際のOtherClass.hはcppファイルにのみ含まれています。これで、OtherClass.hに変更を加えると、MyClass.cppの再コンパイルのみが強制され、MyClass.hのクライアントは強制されません(OtherClass.hも含まれていない場合)。

また、MyClass :: get()に変更を加えることができ、MyClassのすべてのクライアントではなく、MyClass.cppを再コンパイルするだけで済みます。

MyClass.h

#ifndef _MYCLASS_H_
#define _MYCLASS_H_

class OtherClass;

class MyClass {
public:
    MyClass();

    void set(OtherClass* oc);
    OtherClass* get(void);

private:
   OtherClass* _otherClass;
};
#endif

MyClass.cpp

#include "MyClass.h"
#include "OtherClass.h"

MyClass::MyClass() : _otherClass(0) {}

MyClass::set(OtherClass* oc) { _otherClass=oc; }

OtherClass* MyClass::get() { return _otherClass; };
于 2013-02-24T04:17:42.973 に答える
3

しかし、C ++では、なぜC++でプログラマーがクラスの外部でメソッドの定義を記述できるのか疑問に思います。

2つの主な理由は、コンパイル時間と、実装をインターフェースから分離することです。これについては、C ++で詳しく説明されています。なぜヘッダーファイルとcppファイルがあるのですか?

JavaのようなC++プログラムを書く方法はありますか?

実装全体をヘッダーファイルに書き込むことはできますが、そうすべきではありません任意の言語でコードを書くときは、その言語のイディオムに従う必要があります。これにより、読みやすく、保守しやすくなります。

于 2013-02-24T04:18:42.520 に答える