2

おそらく非常に些細な問題で何時間も立ち往生しています。

これはクラスの最も基本的な使い方です。

ヘッダー ファイル: person.h

class person
{
  protected:
    std::string _Name;
  public:
    void setName(std::string);
};

実装: person.cpp

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

void person::setName(std::string name)
{
  _Name = name;
}

ドライバー: main.cpp

#include <iostream>
#include "person.cpp"

int main()
{
  std::cout << "Yes, it worked.\n";
  return 0;
}

(GNU GCC を使用して) CodeBlocks でこのコードをコンパイルしようとすると、エラーが発生します。

~\person.cpp|5|multiple definition of `person::setName(std::string)'|
~\person.cpp|5|first defined here|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|

ヘッダー ファイルにプロトタイプがあり、実装ファイルに本体があります。複数の定義はどこにありますか? person.cpp で 'void' の前に 'inline' を追加すると機能しますが、この場合はなぜですか?

さらに、これとまったく同じコードを cmd で "g++ main.cpp -o main.exe" としてコンパイルすると、(インラインなしで) 完全に動作します!

4

3 に答える 3

4

*.cppmain.cpp にファイルを含める必要はありません。ファイルを含める必要があり*.hます。

つまり*.cpp、ファイルには実装が含まれており、コンパイラによってコンパイルされています。*.hファイルには定義が含まれており、*.cppファイルから含めることができます。ファイルを含める*.cppと、同じオブジェクトの複数の定義が取得されます。

また、インクルードガードを追加する必要があります

#ifndef MY_HEADER
#define MY_HEADER
... code of your header file ...
#endif

または単に追加する

#pragma once

コンパイラがサポートしている場合。

于 2013-01-10T05:37:28.463 に答える