2

そのため、約 3 年間 C++ をあまり使用しておらず、継承したクラスを STL コンテナーで使用する際に問題が発生しています。この種の質問が数回出されたのを見たことがありますが、何が行われているか、または回答と非常に似ているのになぜ私のコードが機能しないのかを正確に理解できませんでした。

基本的に、R と RD の 2 つのクラスがあります。R は基本クラスで、RD は派生クラスです。各要素にはグラフのような種類の隣接要素があるため、要素 r1 の隣接要素はクラス R または RD のいずれかになります。Rでプライベートdequeを作成することで解決したと思いましたが、そのdequeの要素にアクセスするたびに、それらは決してRDではなく、Rのみです。私のコードは次のようなものです:

class R {
public:
    R();
    ~R();

    inline void queue(R* r) { neighbours.push_back(r); }
    inline R& getFirstNeighbour() { return neighbours.top(); }

    virtual void printSomething() { cout << "R" << endl; }
protected:
    deque<R*> neighbours;
}

class RD: public R {
public:
    RD();
    ~RD();

    void printSomething() { cout << "RD" << endl; }
    void doSomethingElse();
}

要素の最初の隣人を取得して printSomething を呼び出すたびに、常に R を取得します。ここで何が間違っているのでしょうか? これはどのように行うべきですか?

どうもありがとう

4

1 に答える 1

0

あなたのコードは機能しますが、いくつかの間違いがあります (コンストラクターとデストラクタに "{ }" がありませんでした。有効なコードをいくつか示します (ここでは std::deque を使用しているため、 top() 関数を front() に置き換えました))。

#include <deque>
#include <iostream>

using namespace std;


class R {
public:
    R(){};
    ~R(){};
inline void queue(R* r) { neighbours.push_back(r); }


//Here is your error, look at the return : you need to dereference your neighbours.front():
inline R& getFirstNeighbour() { return *neighbours.front(); }

virtual void printSomething() { cout << "R" << endl; }
protected:
    deque<R*> neighbours;
};


class RD: public R {
public:
    RD(){};
    ~RD(){};

    void printSomething() { cout << "RD" << endl; }
    void doSomethingElse();
};


int main()
{
R r;
//R with 3 neighbors
r.queue(new RD());


r.getFirstNeighbour().printSomething(); // Printing RD :)


return 0;
}
于 2014-01-31T16:40:12.823 に答える