3

-std = c++0xでEclipse/gccを使用してUbuntuで開発する。

オブジェクトのスライスに問題があるようですが、これはここで見た他の質問には当てはまりません。私は非常に単純な基本クラス/子クラスの継承モデルを持っています。基本クラスには、明らかに子が実装する1つの純粋仮想関数があります。

class Parent{
public:
    Parent();
    virtual ~Parent();
    virtual void DoStuff() = 0;
};

class Child : public Parent{
public:
    Child();
    virtual ~Child();
    virtual void DoStuff(); //Child can have "grandchildren"
};

私が欲しいのは、ワーカースレッドで処理するためにこれらのオブジェクトを格納できるキューを用意することです。ポインタを保存する必要があることはわかっています。そうしないと、スライスが保証されます。したがって、これを行うクラス( "Processor")には、次のものがあります。

typedef queue<Parent*> MYQUEUE; //#include <queue>
static MYQUEUE myQueue;

//Call this after creating "Child c;" and passing in &c:
void Processor::Enqueue(Parent* p) 
{
    myQueue.push(p);
}

void* Process(void* args) //function that becomes the worker thread
{
    while(true)
    {
        if(!myQueue.empty())
        {
            Parent* p = myQueue.front();
            p->DoStuff();
            myQueue.pop();
         }
    }
    return 0;
}

次に起こることは、継承/ポリモーフィズムが正しく機能していないかのように、「純粋仮想メソッドが呼び出されました」と言ってプログラムがクラッシュすることです。テストしたときにこれが機能することを確認したので、継承が正しく設定されていることを知っています。

Child c;
Parent* p = &c;
p->DoStuff();

どんな指導も大歓迎です!

4

2 に答える 2

2

オブジェクトをワーカースレッドに渡す場合、スタック上にオブジェクトを作成することはできません。ワーカースレッドがそれを呼び出すまでに、親スレッドはその関数を離れてオブジェクトを破棄した可能性があります。new親スレッドで(おそらく経由して)動的に割り当てる必要がありdelete、作業が終了した後にのみワーカースレッドで解放()する必要があります。

別の注意点として、ワーカーの実行中に親がジョブをキューに入れることができる場合は、キューアクセスをロックする必要があります。

于 2013-02-19T16:58:24.093 に答える
0

エラーはp、呼び出しの時点でが指しているオブジェクトのタイプが。であることを意味しますParent。それがどのようにそのようになったのかは、あなたが示していないコードに依存します。

于 2013-02-19T16:58:59.323 に答える