- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个“数据提供者”,它将其输出存储在一个结构中某种类型的,例如
struct DATA_TYPE1{
std::string data_string;
};
然后这个结构必须转换成通用数据类型,我想到了 void * 或 char *,因为“中间”将其复制并存储在其二叉树中的对象应该能够存储许多不同类型的此类结构数据。
struct BINARY_TREE_ENTRY{
void * DATA;
struct BINARY_TREE_ENTRY * next;
};
此 void * 随后被另一个对象占用将 void * 转换回 (struct DATA_TYPE1 *)获取原始数据。所以发送者和接收者知道数据类型 DATA_TYPE1 但不知道复制中间的对象。
但是中间对象如何深度复制的内容不同的结构,当它不知道数据类型时,只有 void * 并且没有复制真实内容的方法;dynamic_cast 不适用于 void *;
“中间”对象应该做类似的事情:
void store_data(void * CASTED_DATA_STRUCT){
void * DATA_COPY = create_a_deepcopy_of(CASTED_DATA_STRUCT);
push_into_bintree(DATA_COPY);
}
一个简单的解决方案是发送对象不删除发送的数据结构,直到接收对象得到它,但是发送对象是动态创建和删除的,在接收者从中间对象获取数据之前,用于异步通信,因此我想复制
我没有将它转换为 void *,而是尝试转换到一个父类(super class)指针,其中的中间复制对象知道,并且由所有不同的对象继承结构的数据类型:
struct DATA_BASE_OBJECT{
public:
DATA_BASE_OBJECT(){}
DATA_BASE_OBJECT(DATA_BASE_OBJECT * old_ptr){
std::cout << "this should be automatically overridden!" << std::endl;
}
virtual ~DATA_BASE_OBJECT(){}
};
struct DATA_TYPE1 : public DATA_BASE_OBJECT {
public:
string str;
DATA_TYPE1(){}
~DATA_TYPE1(){}
DATA_TYPE1(DATA_TYPE1 * old_ptr){
str = old_ptr->str;
}
};
相应的二叉树条目将是:
struct BINARY_TREE_ENTRY{
struct DATA_BASE_OBJECT * DATA;
struct BINARY_TREE_ENTRY * next;
};
然后复制未知数据类型,我在类里面试过只是将未知数据类型作为 struct DATA_BASE_OBJECT *(之前是 void *):
void * copy_data(DATA_BASE_OBJECT * data_that_i_get_in_the_sub_struct){
struct DATA_BASE_OBJECT * copy_sub = new DATA_BASE_OBJECT(data_that_i_get_in_the_sub_struct);
push_into_bintree(copy_sub);
}
然后我向 DATA_BASE_OBJECT 添加了一个复制构造函数,但是如果结构 DATA_TYPE1 首先转换为 DATA_BASE_OBJECT 然后已复制,包含的子对象 DATA_TYPE1 也不会被复制。
然后我想到了找出实际物体的大小怎么样复制然后只是 memcopy 它,但字节不存储在一行,我如何找出内存中的实际大小包含 std::string 的结构 DATA_TYPE1?
还有哪些其他 C++ 方法可用于深度复制未知数据类型(并且可能在其他过程中以其他方式获取数据类型信息运行时)?
最佳答案
如果您有一个void *
,则无法从中提取任何类型信息。这就是为什么 void *
在 C++ 程序中很少使用的原因(老实说,我不记得上次使用它是什么时候了)——你在这里的方法是完全错误的。如果您想要在编译时类型已知的通用容器,请使用模板。如果您想要类型在运行时发生变化的容器,请从基类派生并使用基类指针的容器。并且不要编写自己的容器(除了可能作为学习练习)- C++ 有一个非常好的二叉树实现为 std::set 和 std::map。
最后,不要对 C++ 类型的名称使用全部大写。
关于C++如何深度复制具有未知数据类型的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2987890/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Combination of List> 我有多个列表,可以是 2 个或 3 个,最多 10 个列表,有多个
我是一名优秀的程序员,十分优秀!