0

これは、以前に尋ねた質問のフォローアップです。


LIB_A

LIB_Aなどの外部ライブラリにこの基本クラスがあります。

class Instrument
{
    // ...
}

LIB_B

この派生クラスは、別の外部ライブラリ、たとえばLIB_Bにあり、もちろんLIB_Aを参照しています。

class Bond : public Instrument
{
    // ...
};

LIB_Bには、使用Traderしている結合へのポインターを所有するクラスもあります。

class Trader
{
public:
    // ...
    Bond* _bond;
};

LIB_C

LIB_AまたはLIB_Bに触れることはできません。

私自身のコードでは、3番目の「ライブラリ」(ここでは大まかに用語を使用しています)、たとえばLIB_C ポインターを指すクラスを作成しようとしています。TraderBond

class TradeHelper
{
public:
    TradeHelper(Bond** bondPtr): _bondPtr(bondPtr) {}
    Bond** _bondPtr;
};

それはによって構築されています

Trader* t; // assume this is given and not null
TradeHelper* th = new TradeHelper(&(t->_bond))

余談(読む必要はありません)

なぜそのような複雑なスキームを?まあ、Trader::_bond変化する可能性があり、それが何であるかを常にTradeHelper知る必要があります。したがって、本質的に、にリンクされます。だからこそ、もし私が自分のやり方で自由に物事を行うことができたなら、私は説明どおりに正確に行ったでしょう - この2つを次のように結び付けます:Trader_bondTradeHelperTrader

class TradeHelper
{
public:
    TradeHelper(Trader* t): _trader(t) {}
    Trader* _trader;
};

それはによって構築されています

Trader* t; // assume this is given and not null
TradeHelper* th = new TradeHelper(t);

単にBondviaと呼ばれ_trader->_bondます。

悲しいかな、歴史と現状の理由から、構築するために私が利用できる唯一のものは へTradeHelperのポインタTrader::_bondであり、Traderそれ自体ではありません。したがって、ダブルポインターを使用します。


問題

さて、説明されているように、すべてが正常に機能します。しかし、本当の問題は、LIB_Cが LIB_Bを参照できず、 LIB_Aのみを参照できることです。それが意味することは、 だけTradeHelperを知ることができないということです。私の例を書き直したところ、次のようになりました。BondInstrument

class TradeHelper
{
public:
    TradeHelper(Instrument** instPtr): _instPtr(instPtr) {}
    Instrument** _instPtr;
};

そして、私がそれを構築するとき、そこに問題があります:

TradeHelper* th = new TradeHelper(&(t->_bond));

この質問で学んだように、 からBond**への暗黙的な変換はありませんInstrument**

抽象的な質問は、以前に尋ねたものと非常に似ていると思います。許可されている場合、派生クラスポインターへのポインターを基本クラスポインターへのポインターとして渡すにはどうすればよいですかポインターが安全に使用されると仮定するには? 前の質問で、私は何が間違っていたのかを調べました。そして、学んだことから、誰かが前進する方法を提案できるように、自分の状況をより詳細に説明する必要があると感じました.

別のオブジェクト Y のメンバーが「どこに」あるかをオブジェクト X に常に認識させたいのですが、そのメンバーは派生クラスであり、オブジェクト X は基底クラスしか認識していません。

ポインター参照とキャストをいじりましたが、解決策がわかりません。

4

1 に答える 1

0

dynamic_cast を使用してあなたの例を再構築しましたが、この方法で TradeHelper を構築するのに問題はありませんでした。コードで dynamic_cast を使用できない理由はありますか?

Trader trader;
Bond b;
trader._bond = &b;
Trader* t = &trader;

Instrument* inst = dynamic_cast<Instrument*>(t->_bond);
if (inst == NULL) {
    std::cout << "dynamic_cast failed!" << std::endl;
    return 1;
}

TradeHelper* th = new TradeHelper(&inst);
delete th;
于 2013-08-07T12:20:55.930 に答える