3

私は C++ を初めて使用するので、エラー コードはあまり魅力的ではありません。

宿題として簡単な C++ OOP プログラムを作成しようとしていますが、本などに関する情報を収集して表示します。

エラーが発生します:

1>Book.obj : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Author::getFullName(void)" (?getFullName@Author@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) already defined in Author.obj
1>Book.obj : error LNK2005: "public: void __thiscall Author::setFirstName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setFirstName@Author@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Author.obj
1>Book.obj : error LNK2005: "public: void __thiscall Author::setLastName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setLastName@Author@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Author.obj
1>Publisher.obj : error LNK2005: "public: __thiscall Publisher::Publisher(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (??0Publisher@@QAE@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00@Z) already defined in Book.obj
1>Publisher.obj : error LNK2005: "public: __thiscall Publisher::Publisher(void)" (??0Publisher@@QAE@XZ) already defined in Book.obj
1>Publisher.obj : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Publisher::getPublisherInfo(void)" (?getPublisherInfo@Publisher@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) already defined in Book.obj
1>Publisher.obj : error LNK2005: "public: void __thiscall Publisher::setAddress(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setAddress@Publisher@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Book.obj
1>Publisher.obj : error LNK2005: "public: void __thiscall Publisher::setCity(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setCity@Publisher@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) already defined in Book.obj
1>Publisher.obj : error LNK2005: "public: void __thiscall Publisher::setName(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?setName@Publisher@@QAEXV?$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

ここで何か不足していますか?

Book.cpp

#include <iostream>
using namespace std;

#include "Author.cpp"
#include "Publisher.cpp"

class Book
{
    public:
        Book();
        Book(string title, Author *pAuthor, Publisher *pPublisher, double price);
        ~Book();
        void setTitle(string title);
        void setAuthorName(string first, string last);
        void setPublisher(string name, string address, string city);
        void setPrice(double price);
        string convertDoubleToString(double number);
        string getBookInfo();

    private:
        string title;
        double price;
        Author *pAuthor;
        Publisher *pPublisher;
};

Book::Book()
{
}

Book::Book(string title, Author *pAuthor, Publisher *pPublisher, double price)
{
    title = title;
    price = price;
}

Book::~Book()
{
}

void Book::setTitle(string  title)
{
}

void Book::setAuthorName(string first, string last)
{
}

void Book::setPublisher(string name, string address, string city)
{
}

void Book::setPrice(double price)
{
}

string Book::convertDoubleToString(double number)
{
    return 0;
}

string Book::getBookInfo()
{
    return 0;
}

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)
{
    name = name;
    address = address;
    city = city;
}

string Publisher::getPublisherInfo()
{
    return "0";
}

void Publisher::setName(string name)
{
    name = name;
}

void Publisher::setAddress(string address)
{
    address = address;
}

void Publisher::setCity(string city)
{
    city = city;
}
4

4 に答える 4

10

cppファイルを別のcppファイルまたはヘッダーに含めないでください。これにより、ほぼ必然的にオブジェクト定義の重複が発生します。

宣言をヘッダー ファイルに入れ、定義cpp ファイルに入れます。他の cpp ファイルで定義されたオブジェクトのメソッドにアクセスする必要がある cpp ファイルにヘッダーを含めます。

Publisher.cpp例として、その行までの上部をファイル};に入れる必要がありPublisher.hます。他のすべては に残す必要がありPublisher.cppます。さらに、含める必要がある他のヘッダーと一緒に#include Publisher.h、の先頭に追加する必要があります。Publisher.cpp

using namespace std;また、ヘッダーから削除してstd::string、宣言で使用する必要があります。usingただし、cppファイルに入れても問題ありません。

于 2012-09-01T18:09:15.747 に答える
4

#IFNDEFcpp を別の cpp に追加する必要がある場合に、オブジェクト定義の重複を避けるために使用します。

お気に入り

#include <iostream>
using namespace std;
#ifndef CPPADDED
#define CPPADDED

class Publisher
{...}

#endif
于 2012-09-01T18:15:49.510 に答える
1

ヘッダー ファイル例: resource.h を作成し、そこに関数のプロトタイプとクラスを配置します。したがって、次のようになります。

#include <iostream>
#include <string>
using namespace std;
class Book
{
public:
    Book();
    Book(string title, Author *pAuthor, Publisher *pPublisher, double price);
    ~Book();
    void setTitle(string title);
    void setAuthorName(string first, string last);
    void setPublisher(string name, string address, string city);
    void setPrice(double price);
    string convertDoubleToString(double number);
    string getBookInfo();

private:
    string title;
    double price;
    Author *pAuthor;
    Publisher *pPublisher;
};
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;
};
class Author{
    //... prototypes
};

Book.cpp を次のように編集します。

#include "resource.h"
Book::Book()
{
}

Book::Book(string title, Author *pAuthor, Publisher *pPublisher, double price)
{
title = title;
price = price;
}

Book::~Book()
{
}

void Book::setTitle(string  title)
{
}

void Book::setAuthorName(string first, string last)
{
}

void Book::setPublisher(string name, string address, string city)
{
}

void Book::setPrice(double price)
{
}

string Book::convertDoubleToString(double number)
{
    return 0;
}

string Book::getBookInfo()
{
    return 0;
}

そして、これに Publisher.cpp:

#include "resource.h"
Publisher::Publisher()
{
}

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

string Publisher::getPublisherInfo()
{
    return "0";
}

void Publisher::setName(string name)
{
    name = name;
}

void Publisher::setAddress(string address)
{
    address = address;
}

void Publisher::setCity(string city)
{
    city = city;
}

そして、Author.cpp で同じことをしようとすると、関数のプロトタイプ (クラス) を "resource.h" に配置し、"resource.h" を Author.cpp に含めます。

于 2012-09-01T18:24:09.663 に答える
1

ダスブリンケンライトが言ったことに加えて、

ifndefあなたの問題は、ガードを使用しなかったことです。このエラーを回避するには、それを使用する必要があります。クイック検索で、ヘッダーを追加する方法のヒントが得られます。

于 2012-09-01T18:14:31.567 に答える