0

私が取り組んできたプロジェクトでは、ブーストのシグナルを利用しました2。これは、仮想クラスを使い始めるまでは問題なく機能しました。これで、スロットは呼び出されなくなります。以下は私のプロジェクトの簡略版です。

Class Glueは、クラスVSigおよびProcessのインスタンスを作成し、VSigの信号をProcessのスロットに接続します。

IVSig.h:

class IVSig {
public:
    boost::signals2::signal<void (void)> sigTest;
    virtual void update() = 0;
};

VSig.h:

class VSig : public IVSig {
public:
    boost::signals2::signal<void (void)> sigTest;
    void update();
};

VSig.cpp:

void VSig::update()
{
    printf("updating!\n");
    sigTest();
}

Process.h:

class Process {
public:
    void process();
};

Process.cpp:

void Process::process()
{
    printf("hi!\n");
}

Glue.h:

class Glue {
public:
    Glue();
    void callUpdate();

private:
    IVSig *sig;
    Process *proc;
};

Glue.cpp:

Glue::Glue()
{
    sig = new VSig();
    proc = new Process();

    sig->sigTest.connect(boost::bind(&Process::process, proc));

    callUpdate();
}

void Glue::callUpdate()
{
    sig->update();
}

これは「更新中!」と出力するはずです。続いて「こんにちは!」ただし、「更新中!」のみを出力します。

ヘルプや提案は大歓迎です!

4

1 に答える 1

1

問題は、VSigクラスでsigTestを再宣言していて、sig-> sigTestを使用すると、IVSigクラスのsigTestメンバー(宣言された型)にアクセスしているが、更新が実行されると、仮想更新メソッドを呼び出しているためです。 、ローカルのsigTest変数を使用します。私が十分に明確であったかどうかはわかりません。

したがって、経験則は次のとおりです。継承されたクラス内で同じ名前の変数を再定義しないでください。

お役に立てば幸いです。

于 2013-01-10T12:58:40.480 に答える