2

OOP では、プログラムを複数のクラスに分割する必要があります。

C# では、次のようにします。

namespace a
{
  public class ClassA
  {
     //Methods...that are defined and have code in them.

  }
}

そのクラスを使用するには、「using namespace a;」を実行するだけです。

C++ でクラスを作成し、それらを定義して、コードを入れたいとします。

class ClassA
{
  public:
   void methodA();
}

ClassA::methodA()
{
  //implementation.
}

この実装にアクセスするには、#include "ClassA.h" を使用するだけです。私はそれを完全に理解していますが、そのコードを再度実装する必要がありますか? プロジェクトを多くのクラスに広げたいので、それは逆効果に思えます。

では、ClassA を実装し、すべてのメソッドを再実装しないための適切な手順は何でしょうか?

4

3 に答える 3

3

各 CPP ファイルでそれらを再実装する必要はありません。C++ リンカーは、定義が一緒に一致することを確認します。

あなたに必要なのは:

ヘッダー:

#ifndef FOO_H
#define FOO_H

class Foo{
  //Junk goes here
};

#endif

cpp:

#include "foo.h"

//implementations for junk goes here
void Foo::junk(){

}

そして、含めることができますfoo.h。各 cpp は.oファイルにコンパイルされます。それよりも、これらの.oファイルはリンカーに渡され、リンカーは定義がどこにあるかを把握し、コードを正しくつなぎ合わせることができます。

于 2012-10-30T03:04:41.420 に答える
2

C と C++ では、処理方法が異なります。クラス、メソッド、または外部変数の宣言がある限り、コンパイラは喜んでコンパイルし、リンク時にメソッド、クラスなどの実際の定義を省略します。これは非常に単純化されていますが、基本的に、コンパイラはオブジェクト ファイル内のリンカにヒントを残し、リンカはここにメソッドのアドレスを挿入する必要があることを伝えます。

したがって、「ClassA.h」ファイルをインクルードするだけで、問題なくコンパイルできます。

このため、C および C++ では、C# とは異なる動作が見られます。たとえば、C または C++ では、どちらもファイルの外部で見えない限り、異なるファイルで同じ名前の 2 つの異なる項目 (メソッド、変数など) を使用してもまったく問題ありません。一方、C# では、別の名前空間または別の名前を使用する必要があります。注-これが良い習慣だと言っているわけではありません。可能です。

于 2012-10-30T03:05:38.547 に答える
1

.hヘッダー ファイルには、クラスの仕様が含まれています。対応する.cppファイルには実装が含まれており、ファイルにコンパイルされ.oます。開発中に.h、クラスによって提供される API にアクセスするためのファイルを含めます。コンパイル/リンク段階で、.oソース ファイルと一緒にファイルを含めて、最終的なバイナリを形成します。使用しているクラスに関しては、何も再度実装する必要はありません。

于 2012-10-30T03:05:23.033 に答える