这是the question asked earlier的后续行动。
我在外部库中有这个基类,比如 LIB_A 。
class Instrument
{
// ...
}
我在另一个外部库中有这个派生类,比如 LIB_B ,当然引用 LIB_A 。
class Bond : public Instrument
{
// ...
};
在 LIB_B 中,我还有一个Trader
类,它拥有指向它正在使用的键的指针。
class Trader
{
public:
// ...
Bond* _bond;
};
我无法触及 LIB_A 或 LIB_B 。
在我自己的代码中,第三个“库”(我在这里松散地使用这个术语),比方说, LIB_C ,我正在尝试创建一个类指向指向Trader
的{{1}} 指针,即
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
的{{1}}是什么。基本上,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
的是指向_trader->_bond
的指针,而不是{{1}本身。因此我使用了双指针。
好吧,如上所述,一切都会正常工作。但真正的问题是 LIB_C 无法引用 LIB_B ,只能 LIB_A 。这意味着TradeHelper
无法了解Trader::_bond
,只知道Trader
。我的例子改写了,现在看起来像这样:
TradeHelper
当我构建它时,存在问题:
Bond
正如我在this question中了解到的,没有从Instrument
到class TradeHelper
{
public:
TradeHelper(Instrument** instPtr): _instPtr(instPtr) {}
Instrument** _instPtr;
};
的隐式转换。
我猜抽象问题与我之前提到的问题非常相似:如何将指针指向派生类指针作为指针传递给基类指针鉴于我被允许假设指针会被安全使用?在上一个问题中,我找到了我在做什么错误,并且在学习之后,我觉得我需要描述我的更详细的情况,任何人都可以建议前进的方向。
Reworded,我希望对象X始终知道另一个对象Y的成员所在的“where”,但该成员是派生类,而对象X只知道基类。
我已经使用指针引用和转换进行了修改,但似乎无法找到出路。
答案 0 :(得分: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;