0

私はC++を初めて使用します。

そこで、本などの情報を集めて表示するプログラムを作成しています。まず、自分がやっているコードについてもう少し学びたいのですが、c++のエラーコードに慣れていません。

BookとPublisherの2つのクラスを作成しました。それぞれに、独自のコンストラクターとメソッドが含まれています。クラス図に示されているすべてのクラスとメソッドを含むプログラムを作成しようとした後、次のようなエラーが発生したときに停止しました。

1>Publisher.obj : error LNK2005: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl getPublisherInfo(void)" (?getPublisherInfo@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) already defined in Book.obj
1>Publisher.obj : error LNK2005: "void __cdecl setAddress(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setAddress@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Book.obj
1>Publisher.obj : error LNK2005: "void __cdecl setCity(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setCity@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Book.obj
1>Publisher.obj : error LNK2005: "void __cdecl setName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setName@@YAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Book.obj
1>C:\Users\pc\Desktop\School\ITS 340\Labs\Lab 1\Lab 1\Debug\Lab 1.exe : fatal error LNK1169: one or more multiply defined symbols found

これは私のPublisher.cppファイルです:

#include <iostream>
using namespace std;

class Publisher
{
    public: 
        Publisher();
        Publisher(string name, string address, string city);
        string getPublisherInfo();
        void setName(string name);
        void setAddress(string address);
        void setCity(string city);

    private:
        string name;
        string address;
        string city;
};

Publisher::Publisher()
{
}

Publisher::Publisher(string name, string address, string city)
{
}

string getPublisherInfo()
{
    return 0;
}

void setName(string name)
{
}

void setAddress(string address)
{
}

void setCity(string city)
{
}

このエラーを回避するにはどうすればよいですか?

4

1 に答える 1

3

あなたは1つの定義ルールを破っています。ヘッダー ファイルでクラスと関数を宣言し、インクルード ガードでそれらを保護し、関数とクラス メンバー関数の実装または定義.cppのみをファイルに配置する必要があります。

例えば:

フー.h:

#ifndef FOO_H_
#define FOO_H_
class Foo {
  Foo();
  void foo() const;
};
#endif

Foo.cpp:

#include "Foo.h"
Foo::Foo() { .... }
void Foo::foo() const { .... }

main.cpp

#include "Foo.h"
int main()
{
  Foo f;
  f.foo();
}

これは OOP から完全に独立しています。無料の関数でも同じことを行う必要があります。

于 2012-09-01T16:23:12.627 に答える