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_ALIB_B

在我自己的代码中,第三个“库”(我在这里松散地使用这个术语),比如LIB_C,我正在尝试创建一个指向aTraderBond 指针的类,

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需要知道那是什么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);

并简称为Bondvia _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**中了解到的,从to没有隐式转换Instrument**

我想这个抽象问题与我之前提出的问题非常相似:如果我被允许,我如何将指向派生类指针的指针作为指向基类指针的指针传递假设指针可以安全使用?在上一个问题中,我寻找了我做错了什么,并且了解到,我觉得我需要更详细地描述我的情况,以便任何人都能够提出前进的方向。

改写一下,我希望对象 X 始终知道另一个对象 Y 的成员“在哪里”,但该成员是派生类,而对象 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 回答