c++构建器xe2上更不稳定的行为:DYNAMIC_CAST总是返回NULL
More erratic behavior on c++ builder xe2: DYNAMIC_CAST always returns NULL
由于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_cast都有效。
欢迎任何灯光
PS:虚析构函数已作为其他post添加,但不能工作。
为了用dynamic_cast
将TTreeNode
指针类型转换为TStructTreeNode
指针,您必须实例化一个真正的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);
}
将PACKAGE添加到TStructTreeNode的类定义中已经解决了这个问题
class PACKAGE TStructTreeNode: public TTreeNode
但是似乎Embarcadero工作不规律,因为在同一个包中,我有另一个单元,其中动态转换一个名为TMDTreeNode的类没有包指令也能正常工作。
class TMDTreeNode: public TTreeNode
代码:
((TStructTreeNode*)(Items->Item[i]))->ToggleChecked();
不能"证明"Items->Item[i]
是(TStructTreeNode *)
,甚至不能接近。它只是解释当前指针所指向的位置的内存,就好像它是一个TStructTreeNode
。
如果它不是TStructTreeNode
,那么行为是未定义的,这意味着它可能会成功,也可能不会成功。即使它是一个TStructTreeNode,如果Items->Item[i]
的数据类型不是指向TStructTreeNode
基类的指针,那么dynamic_cast<>
也会失败。我希望你不会期望dynamic_cast<>
将"解码"void *
或其他东西。
能否显示Item
的声明?
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理