1

私は今、愚かだと感じています.C++を何年もやっていないので、何が悪いのか理解できません...しかし、私はこの次のクラスを取得しました:

#include <string>
class NamedObject
{
    public:
        NamedObject();
        virtual ~NamedObject();
        virtual std::string getName() const { return m_name };
        virtual void setName(const std::string name) { m_name = name };
    private:
        std::string m_name;
};

そして今、私はそれから単純なクラスを継承しています:

#include "NamedObject.h"
enum eTeam { eAttacker, eDefender, eSpectator, eNone };
class Player : public NamedObject
{
    public:
        Player();
        virtual ~Player();
        virtual void printName();
        virtual eTeam getTeam() const { return m_team };
        virtual void setTeam(const eTeam team) { m_team = team };
    private:
        std::string m_name;
        eTeam m_team;
};

しかし、main.cpp から player->setName("blabla") を使用できませんか? メインファイルは次のとおりです。

#include "Player.h"
int main()
{
    Player* p1 = new Player();
    p1->setName("Name Changed!")
    p1->printName(); // prints "Unnamed" since I declared that in default ctor
    return 0;
}

エラーは発生しません。すべて正常に動作します。名前が単に変更されるわけではありません。また、すべてのコンストラクターとデストラクタ、およびprintNameメソッドが完全に機能しており、問題はそれらの中にありません。

4

3 に答える 3

4

派生クラスで再宣言しているため、親クラスのをsetName変更し、派生クラスのを出力します。m_nameprintNamem_namestd::string m_name;

派生クラスから宣言を削除し、親クラスのメンバーm_nameとしてマークします。protected

#include <string>
class NamedObject
{
public:
    NamedObject();
    virtual ~NamedObject();
    virtual std::string getName() const { return m_name };
    virtual void setName(const std::string name) { m_name = name };
protected:
    std::string m_name;
};

moswald が提案しているように、m_name非公開にして代わりにメソッドを使用することもできます。getName()

于 2012-11-19T18:57:17.140 に答える
2

m_name親クラスの変数をシャドウする派生クラスに別の変数を作成しました。

于 2012-11-19T18:55:14.390 に答える
0

それはあなたの本当のコードであってはならないことがわかります。

派生/スーパー クラスが m_name を再宣言しています。おそらくあなたの意図とは違うでしょう;)

于 2012-11-19T18:55:45.467 に答える