1

Person.h

#ifndef PERSON_H_
#define PERSON_H_

/* Person.h */

class Person {
  int age;
  std::string name;

  public:
    Person(int, std::string);
    std::string getName();
    int getAge();

};

#endif /* PERSON_H_ */

person(int std::string) 関数宣言では std::string という名前を使用していますが、ヘッダー ファイルには含めていません。したがって、コンパイラがシンボルの欠落について文句を言うと思います。それでも、コンパイルして正常に実行できます。なんで?

残りのコード...

人.cpp

#include <string>
#include "Person.h"

Person::Person(int age, std::string name)
{
  this->name = name;
  this->age = age;
}

std::string Person::getName()
{
  return this->name;
}

int Person::getAge()
{
  return this->age;
}

メイン.cpp

#include <string>
#include "Person.h"

int main() {

  printFunc();

  Person chelsea_manning(5, std::string("Chelsea Manning"));

}

また、私は C++ を初めて使用するので、私のコードや OOP についておかしなところがあれば教えてください。

4

1 に答える 1

5

プログラムのコンパイルは、関数を含むファイルの先頭から開始されますmain(技術的には、プログラムがコンパイルされる前にプリプロセッサが実行されますが、それでも同じ場所から開始されます)。あなたの場合、最初に行うことは<string>そのファイルに含めることです。その後、含まれていますPerson.h。はすでに含まれているため<string>、文字列ファイルのすべてのコンテンツはコード内で個人ファイルよりも前にあり、すべてが適切な順序で宣言されています。Person.hの前にインクルードした場合<string>、または<string>メイン ファイルにインクルードしなかった場合、実際にコンパイル エラーが発生します。

#include指示はコピー/貼り付けのように機能します。文字通りファイルを読み取り、<string>その内容をインクルード元のソース ファイルに平手打ちします。次に、 に対しても同じことを行いPerson.hます。したがって、プリプロセッサを実行した後の最終結果は

<-- contents of <string> -->
<-- contents of Person.h -->

int main()
...

したがって、あなたの例では、すべてが正しい順序で宣言されています。

于 2013-11-03T04:01:29.517 に答える