これは、以前に尋ねた質問のフォローアップです。
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 、のポインターを指すクラスを作成しようとしています。Trader
Bond
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
_bond
TradeHelper
Trader
class TradeHelper
{
public:
TradeHelper(Trader* t): _trader(t) {}
Trader* _trader;
};
それはによって構築されています
Trader* t; // assume this is given and not null
TradeHelper* th = new TradeHelper(t);
単にBond
viaと呼ばれ_trader->_bond
ます。
悲しいかな、歴史と現状の理由から、構築するために私が利用できる唯一のものは へTradeHelper
のポインタTrader::_bond
であり、Trader
それ自体ではありません。したがって、ダブルポインターを使用します。
問題
さて、説明されているように、すべてが正常に機能します。しかし、本当の問題は、LIB_Cが LIB_Bを参照できず、 LIB_Aのみを参照できることです。それが意味することは、 だけTradeHelper
を知ることができないということです。私の例を書き直したところ、次のようになりました。Bond
Instrument
class TradeHelper
{
public:
TradeHelper(Instrument** instPtr): _instPtr(instPtr) {}
Instrument** _instPtr;
};
そして、私がそれを構築するとき、そこに問題があります:
TradeHelper* th = new TradeHelper(&(t->_bond));
この質問で学んだように、 からBond**
への暗黙的な変換はありませんInstrument**
。
抽象的な質問は、以前に尋ねたものと非常に似ていると思います。許可されている場合、派生クラスポインターへのポインターを基本クラスポインターへのポインターとして渡すにはどうすればよいですかポインターが安全に使用されると仮定するには? 前の質問で、私は何が間違っていたのかを調べました。そして、学んだことから、誰かが前進する方法を提案できるように、自分の状況をより詳細に説明する必要があると感じました.
別のオブジェクト Y のメンバーが「どこに」あるかをオブジェクト X に常に認識させたいのですが、そのメンバーは派生クラスであり、オブジェクト X は基底クラスしか認識していません。
ポインター参照とキャストをいじりましたが、解決策がわかりません。