2010-12-13 12 views
0

私のアプリケーションでは、アプリケーションによって提供される一連のインターフェイスを保持する必要があるクラスがあります。複数の継承を使用すると、Visual Studio 2010デバッガに値が表示されない

クラス自体はすべての可能なインターフェイスを認識していないため、各インターフェイスに対して1つのデータメンバを保持するだけではありません。代わりに、インタフェースのベクトルを保持する必要があります。

実際には、これは、より特定のすべてのインターフェイスが継承する1つの「汎用」インターフェイス(IGeneric)を定義することを意味します。そのように、私は簡単に(コード以下に、私はいくつかのダミーの名前で、実際のインタフェース名を交換し、自分のアプリケーションに名前がはるかに意味のある)すべてのインターフェイスでベクトルを保つことができます。

#include <vector> 
#include <windows.h> 

class IGeneric 
    { 
    public: 
     virtual ~IGeneric() {} 
    }; 

class IFirst : public IGeneric {public: virtual void one() = 0;}; 
class ISecond : public IGeneric {public: virtual void two() = 0;}; 
class IThird : public IGeneric {public: virtual void three() = 0;}; 
class IFourth : public IGeneric {public: virtual void four() = 0;}; 

typedef std::vector<IGeneric *> GenericContainer; 

インストールするにはインターフェース、他のモジュール(すべてのインターフェースを実際に知っている)は、インターフェースをインストールするための機能を提供します。彼らはこのようなものが考えられます。practiveので

void installFirst (GenericContainer &bc, IFirst &b) { bc.push_back(&b); } 
void installSecond (GenericContainer &bc, ISecond &b) { bc.push_back(&b); } 
void installThird (GenericContainer &bc, IThird &b) { bc.push_back(&b); } 
void installFourth (GenericContainer &bc, IFourth &b) { bc.push_back(&b); } 

、アプリケーションでは、このように、これらのインタフェースの複数を実装するクラス、書きます:

class DoAll : public IFirst, public ISecond, public IThird, public IFourth 
    { 
    public: 
     virtual void one() {} 
     virtual void two() {} 
     virtual void three() {} 
     virtual void four() {} 
     DoAll(int i) : m_i(i) {} 
    private: 
     int m_i; 

を};

この実装をインストールするのはとても簡単です。これは私の例のメインルーチンです:

int main() { GenericContainer gc;

DoAll all(123);

installFirst(gc、all); installSecond(gc、all); installThird(gc、すべて); installFourth(gc、all);

DebugBreak(); }

ブレークポイントで、デバッガでのベクトルの内容を調べるようになりました。あなたが見ることができるように、それはインターフェースの実装は(すべての4例で)DOALLあることを示し、

alt text

、及びそれも示しているようにインターフェース(IFirst、ISecond、..:それはこのようになりますDoAllはベクターにインストールされています。

問題は、デバッガが最も派生したクラス(DoAll)の内容を表示できないようです。それはdatamember m_iを表示しますが、m_iの値を表示することはできません。私は明示的に最初のインターフェイスアドレスを取り、「DOALL *」にキャストした場合

のみ、私は正確に内容を見ることができます。

alt text

私は、次のコマンドを使用してコンパイルとリンク:

cl /c /EHsc /GR /Zi /Od test.cpp 
link /debug test.obj 

これはVisual Studio 2010のバグですか、何か不足していますか?

EDIT:

class DoFirst : public IFirst 
    { 
    public: 
     virtual void one() {} 
     DoFirst(int i) : m_i(i) {} 
    private: 
     int m_i; 
    }; 

そして、このようなベクトルで、それをインストールします:私はこのクラスのような単一継承、使用している場合

DoFirst f (456); 
installFirst (gc,f); 

をデバッガが私を示してい正しい値を返し、すぐに最も派生したクラスをすぐに表示します:

alt text

答えて

0

あなたはIGenericへのポインタを保持しています。 IGenericはDoAllのメンバーであるm_iについて何の手掛かりも持っていません。デバッガが{m_i = ???}を表示しているので実際にはバグがあると言うこともありますが、そうではありません。

+0

単一の継承を使用する場合(たとえば、IFirstから継承するDoFirstクラスを追加し、これをinstallFirstを使用してベクターに追加する場合)、デバッガはすぐに私に最も派生したクラスとその内容を表示します。それは多重継承で間違っているだけです。 Visual Studioでは、最も派生したクラスをすぐに表示することによってデバッグ開発者が簡単にしようとしますが、複数の継承を使用する場合は機能しません。 – Patrick

+0

だから、それはバグではなく、デバッガの設計上の半分の特徴であると結論づけるかもしれません。私はそれが実際に文書化されているのか疑問です。 – Dialecticus

関連する問題