0

だから私はこのクラスを作りました:

    class Book
    {
        public:
            Book(string newTitle = "???", string newAuthor = "???");
            virtual ~Book();

            string getTitle();
            string getAuthor();
            void setTitle(string  newTitle);
            void setAuthor(string newAuthor);

            virtual string allInfo();

        private:
            string title;
            string author;
    };

そして、私はと呼ばallInfo()れる他の 2 つのクラスで関数をカバーするつもりでした。どちらも から継承しています。HardcoverBooksAudioBooksBook

これは、最初にクラス.cppの両方のクラスのファイルで行ったことです。AudioBook

string AudioBook::allInfo(){
    stringstream newString;

    newString<<"Title: "<<this->title<<endl<<"Author: "<<this->author<<endl
             <<"Narrator: "<<this->narrator<<endl
             <<"Length(in minutes):     "<<this->length<<endl<<endl;

    return newString.str();
}

そして、これはHardcoverBookクラスで:

string HardcoverBook::allInfo(){
    stringstream newString;

    newString<<"Title: "<<this->title<<endl<<"Author: "<<this->author<<endl
             <<"Pages: "<<this->pages<<endl<<endl;

    return newString.str();
}

AudioBookクラスがこれについて不平を言っていることを除いて、すべてがうまく機能しています。

include\Book.h||メンバー関数内 'virtual std::string AudioBook::allInfo()':| include\Book.h|41|エラー: 'std::string Book::title' は非公開です| mningsuppgiftIIB\src\AudioBook.cpp|27|エラー: このコンテキスト内| include\Book.h|42|エラー: 'std::string Book::author' は非公開です| mningsuppgiftIIB\src\AudioBook.cpp|27|エラー: このコンテキスト内| ||=== ビルドが終了しました: 4 つのエラー、0 の警告 ===|

しかしHardcoverBook、不思議なことに、これについてはまったく文句を言いません。

私の質問:

  1. これを機能させるにはどうすればよいですか?allInfo()(つまり、両方のクラスが独自の方法で関数を使用できるようにするため)

  2. なぜこのように機能しないのですか?

編集: これは私がやっている宿題です。要件の 1 つは、メンバー変数とプロパティを非公開にすることです。したがって、保護された機能は機能します。その人たちの称賛ですが、別のボーナス質問を追加します。

  1. プライベート メンバー変数を使用するにはどうすればよいですか?
4

3 に答える 3

3

titleとのauthorメンバーはprivateです。つまり、 のようなサブクラスでは表示されませんAudioBook

それらをサブクラスから見えるようにするには、.protectedではなくこれらのメンバーを作成する必要がありますprivate

もう 1 つのオプションは、メンバー フィールドを非公開のままにし、保護されたアクセス メソッドまたはパブリック アクセス メソッドを追加して、値を読み取れるようにすることです。例えば:

public:
    string getAuthor()
    {
        return author;
    }

this->また、クラスのメンバーへのアクセスに使用している理由がわかりません。その必要はなく、通常は単純に省略するのが最善です。


あなたの宿題を見ないと、その要件をどう判断したらよいか 100% わかりません。

メンバー変数とプロパティはプライベートです

私の推測では、あなたの仕事はオーバーライドすることallInfo()です。返された を拡張してstring、基本クラスの実装に含まれるすべての情報を含め、さらに追加するよう求められています。

現在の試みは、 のコードを複製するだけですBook::allInfo()。そして、それが問題です。これが機能するためには、派生クラスがプライベート メンバーにアクセスする必要があります。そして、あなたはそれをすることを許されていません。そのため、ソリューションにはallInfo()、基本クラスで呼び出しを行い、基本クラスの実装が返す文字列に追加する必要があります。

これは宿題なので、実装は差し控えます!

于 2013-03-14T19:37:15.913 に答える
2

メンバーprotectedが派生クラスを介してアクセスできるようにします。

  protected:
            string title;
            string author;

それ以外の場合、派生クラスには表示されません。

非公開メンバーと保護メンバー:

クラス A のパブリックメンバーは、すべてのユーザーがアクセスできます。

クラス A の保護されたメンバーは、A のコードの外部からはアクセスできませんが、A から派生したクラスのコードからはアクセスできます。

クラス A のプライベートメンバーは、A のコードの外部、または A から派生したクラスのコードからはアクセスできません。

それらを残したい場合private、もう1つの方法は、それらのメソッドを作成protectedまたはpublicアクセスすることです。

于 2013-03-14T19:37:32.093 に答える
1

privateメンバーを次のように変換する必要があります。

protected:
    string title;
    string author;

このようにして、サブクラスはそれらにアクセスできます。

于 2013-03-14T19:37:59.630 に答える