0

好吧,由于 Embarcadero,我几乎要放弃大约 12 年的 delphi 和 c++ builder 了。从来没有见过这么有问题的IDE。

这次的问题是 dynamic_cast 总是返回 NULL。

在同一个单元中,我派生了两个类:

class TStructTreeNode: public TTreeNode
class PACKAGE TStructTreeView : public TTreeView

转换为 TStructTreeView 工作正常:

TStructTreeView* tv = dynamic_cast<TStructTreeView*>( AOwner->Owner );

但是对 TStructTreeNode 的强制转换总是返回 NULL:

TStructTreeNode* snode = dynamic_cast<TStructTreeNode*>(Items->Item[i]);

请注意 Items->Item[i] 实际上是 TStructTreeNode ,因为下一个代码可以正常工作:

((TStructTreeNode*)(Items->Item[i]))->ToggleChecked();

创建的节点如下:

TStructTreeNode* snode = new TStructTreeNode(Items,UniqueID);
TTreeNode* node = Items->AddNode(snode,Relative,S,Ptr,Method);

在同一个包中,我还有其他组件,其类 TMDTreeNode 和 TMDTreeView 以相同的方式派生,在该单元中,所有 dynamic_casts 都有效。

欢迎任何光线。

PS:虚拟析构函数已作为其他帖子添加并且无法正常工作。

4

3 回答 3

0

在 TStructTreeNode 的类定义中添加 PACKAGE 解决了问题

class PACKAGE TStructTreeNode: public TTreeNode

但似乎 Embarcadero 工作不规律,因为在同一个包中我有另一个单元,其中动态转换一个名为 TMDTreeNode 的类可以在没有 PACKAGE 指令的情况下正常工作。

class TMDTreeNode: public TTreeNode
于 2013-05-28T22:09:37.483 回答
0

为了将指针类型TTreeNode转换为TStructTreeNode指向带有 的指针dynamic_cast,您必须实例化一个真实TStructTreeNode实例以满足转换。如果您使用的是通用TTreeNodes方法,例如Add(),则覆盖虚拟CreateNode()方法以告诉TTreeView创建TStructTreeNode实例而不是TTreeNode实例。例如:

class PACKAGE TStructTreeView : public TTreeView
{
protected:
    virtual TTreeNode* __fastcall CreateNode();
};

TTreeNode* __fastcall TStructTreeView::CreateNode()
{
    return new TStructTreeNode(Items);
}
于 2013-05-28T21:37:53.743 回答
0

你的代码:

((TStructTreeNode*)(Items->Item[i]))->ToggleChecked();

不“证明”那Items->Item[i]是一个(TStructTreeNode *),甚至接近。它所说的只是解释该指针当前指向的位置的内存,就好像它是一个TStructTreeNode.

如果不是,TStructTreeNode则行为未定义,这意味着它可能会或可能不会成功。即使是 TStructTreeNode,dynamic_cast<>如果 的数据类型Items->Item[i]不是指向TStructTreeNode. 我希望你不要期望它dynamic_cast<>会“解码”avoid *或其他东西。

你能出示 的声明Item吗?

于 2014-03-04T01:03:37.233 回答