0

これが私のコードです:

class LibItem
{
public:
    virtual void PrintDetails() = 0;
    virtual void setDetails() = 0;
    void setTitle(string TitleName)
    {
        Title = TitleName;
    }
    string getTitle()
    {
        return Title;
    }
    void setReleaseDate(string date)
    {
        ReleaseDate = date;
    }
    string getReleaseDate()
    {
        return ReleaseDate;
    }
    void setAuthor(string AuthorName)
    {
        Author = AuthorName;
    }
    string getAuthor()
    {
        return Author;
    }
    void setCopyright(string CopyrightDetails)
    {
        Copyright = CopyrightDetails;
    }
    string getCopyright()
    {
        return Copyright;
    }
    void setGenre(string GenreDetails)
    {
        Genre = GenreDetails;
    }
    string getGenre()
    {
        return Genre;
    }
    void setStatus(string StatusDetails)
    {
        Status = StatusDetails;
    }
    string getStatus()
    {
        return Status;
    }
private:
    string Title;
    string ReleaseDate;
    string Author;
    string Copyright;
    string Genre;
    string Status;
};

class Book : public LibItem
{
public:
    Book(string TitleName)
    {
        setTitle(TitleName);
    }
    void setISBN(int ISBNDetails)
    {
        ISBN = ISBNDetails;
    }
    int getISBN()
    {
        return ISBN;
    }
    void setDetails(string setBookTitle, string setBookAuthor, string setBookReleaseDate, string setBookCopyright, string setBookGenre, string setBookStatus, int setBookISBN)
    {
        setTitle(setBookTitle);
        setAuthor(setBookAuthor);
        setReleaseDate(setBookReleaseDate);
        setCopyright(setBookCopyright);
        setGenre(setBookGenre);
        setStatus(setBookStatus);
        setISBN(setBookISBN);
    }
    void PrintDetails()
    {
        cout << "Title: " << getTitle() << endl;
        cout << "Author: " << getAuthor() << endl;
        cout << "Release Date: " << getReleaseDate() << endl;
        cout << "Copyrite: " << getCopyright() << endl;
        cout << "Genre: " << getGenre() << endl;
        cout << "Status: " << getStatus() << endl;
        cout << "ISBN: " << getISBN() << endl;
    }

private:
    Book();
    int ISBN;

};

class DVD : public LibItem
{
public:
    DVD(string TitleName)
    {
        setTitle(TitleName);
    }
    void setRunningTime(int RunningTimeDetails)
    {
        RunningTime = RunningTimeDetails;
    }
    int getRunningTime()
    {
        return RunningTime;
    }
    void setDirector(string DirectorDetails)
    {
        Director = DirectorDetails;
    }
    string getDirector()
    {
        return Director;
    }
    void setStudio(string StudioDetails)
    {
        Studio = StudioDetails;
    }
    string getStudio()
    {
        return Studio;
    }
    void setProducer(string ProducerDetails)
    {
        Producer = ProducerDetails;
    }
    string getProducer()
    {
        return Producer;
    }
    void setDetails(string setDVDTitle, string setDVDAuthor, string setDVDReleaseDate, string setDVDCopyright, string setDVDGenre, string setDVDStatus, int setDVDRunningTime, string setDVDDirector, string setDVDStudio, string setDVDProducer)
    {
        setTitle(setDVDTitle);
        setAuthor(setDVDAuthor);
        setReleaseDate(setDVDReleaseDate);
        setCopyright(setDVDCopyright);
        setGenre(setDVDGenre);
        setStatus(setDVDStatus);
        setDirector(setDVDDirector);
        setStudio(setDVDStudio);
        setProducer(setDVDProducer);
    }
    void PrintDetails()
    {
        cout << "Title: " << getTitle() << endl;
        cout << "Author: " << getAuthor() << endl;
        cout << "Release Date: " << getReleaseDate() << endl;
        cout << "Copyrite: " << getCopyright() << endl;
        cout << "Genre: " << getGenre() << endl;
        cout << "Status: " << getStatus() << endl;
        cout << "Running Time: " << getRunningTime() << endl;
        cout << "Director: " << getDirector() << endl;
        cout << "Studio: " << getStudio() << endl;
        cout << "Producer: " << getProducer() << endl;
    }

private:
    DVD();
    int RunningTime;
    string Director;
    string Studio;
    string Producer;

};

仮想 void setDetails(); に問題があります。

Book クラスと DVD クラスの両方に、詳細を設定するための setDetails というメソッドが必要です。問題は、Book クラスと DVD クラスの両方がこのメソッドに対して異なる引数を持っていることです。

どうすればこれを達成できますか?

この問題を解決する最善の方法は何ですか?

4

5 に答える 5

0

以来

setDetails(string setDVDTitle, string setDVDAuthor, string setDVDReleaseDate, string setDVDCopyright, string setDVDGenre, string setDVDStatus, int setDVDRunningTime, string setDVDDirector, string setDVDStudio, string setDVDProducer)

DVDオブジェクトに対してのみ意味があり、

setDetails(string setBookTitle, string setBookAuthor, string setBookReleaseDate, string setBookCopyright, string setBookGenre, string setBookStatus, int setBookISBN)

virtualBookに対してのみ意味があり、メソッドは、または基本クラスにあるべきではありません。

私があなたに与えると言ってLibItem*、私はあなたにその詳細を設定するように言います。職業はなんですか?具体的な実装クラスごとに異なるため、詳細を設定するのは理にかなっていますか?

基本クラスには、以下を設定するメソッドのみが含まれている必要があります。

string Title;
string ReleaseDate;
string Author;
string Copyright;
string Genre;
string Status;

virtualその動作は実装ごとに変わらないため、そうすべきではありません。実装クラス自体に特定の詳細を設定する必要があります。

于 2012-08-28T15:51:03.940 に答える
0
virtual void LibItem::setDetails() = 0;

void Book::setDetails(string setBookTitle, string setBookAuthor, string setBookReleaseDate, string setBookCopyright, string setBookGenre, string setBookStatus, int setBookISBN)

void DVD::setDetails(string setDVDTitle, string setDVDAuthor, string setDVDReleaseDate, string setDVDCopyright, string setDVDGenre, string setDVDStatus, int setDVDRunningTime, string setDVDDirector, string setDVDStudio, string setDVDProducer)

は異なるメソッドであるため、コードにオーバーロードはありません。

ところで。LibItem の仮想デストラクタを忘れないでください...

于 2012-08-28T15:57:41.183 に答える
0

これを処理するには 2 つの方法があります。1 つ目は varargs を含み、ベース内のインターフェースを であると宣言しますsetDetails( std::string const& title... )。ただし、この方法は後で原因不明のクラッシュにつながる可能性があるため、これ以上説明しません。他の解決策は、次のようなものを使用することです: setDetails( std::map< std::string, std::string > const& )、具体的な実装では、必要な詳細を名前で抽出します。それでも、それが良い解決策かどうかはわかりません。与えられた aLibItem*では、マップに何を入れればよいかわからないからです。(オブジェクトのタイプと詳細のリストをユーザーから取得すれば、有効な解決策になる可能性があります。それでも、おそらくこれをファクトリ関数にカプセル化します。これにより、作成しているタイプがわかり、詳細が検証されます対応してから、すべての詳細をコンストラクターに渡します。)

intISBN に を使用することはできません。最も合理的な表現は文字列です。

于 2012-08-28T16:10:40.573 に答える
0

抽象基本クラスには、すべての派生クラスに共通の関数のみを含めることができるため、異なる派生クラスで異なる関数が必要な場合、それらを基本クラスに含めることはできません。

ダウンキャストして派生型を取得し、その型固有の関数にアクセスできます。

LibItem & item = some_item();

if (Book * book = dynamic_cast<Book*>(&item)) {
    book->setDetails(book_details);
} else if (DVD * dvd = dynamic_cast<DVD*>(&item)) {
    dvd->setDetails(dvd_details);
}

多くの異なるタイプと多くのタイプ固有の操作がある場合は、Visitor パターンを検討する価値があるかもしれません。しかし、それはほとんどの状況でやり過ぎです。

于 2012-08-28T15:54:23.787 に答える
0

できません。共通のインターフェイスが必要です。http://www.tutorialspoint.com/cplusplus/cpp_interfaces.htm . この記事は、抽象クラスの理解に大いに役立ちます。異なる子に対して異なる引数を持つメンバー関数は仮想であってはなりません。

コードを調べる:

引数の型を「string」から「const string&」に変更してみてください。コピーを避けることができます。

于 2012-08-28T15:55:49.853 に答える