【发布时间】:2016-11-07 15:09:02
【问题描述】:
我问这个是因为即使它似乎有效,但我觉得它不应该。目标是让一组对象保持活动状态,并对其进行一般访问。这就是我目前所拥有的:
获取基指针访问:
struct base { virtual void tick() = 0; }; //ptr access
从它继承的不同类型:
struct :public base
{
void tick() { cout << "im type 1" << endl; }
}type1;
struct :public base
{
void tick() { cout << "im type 2" << endl; }
}type2;
然后是一个容器类,它应该能够存储任意数量的这些序列化:
class control
{
struct xtype //struct for organizing objects
{
vector<char>charbuf; //serialized object
}xtype_template;
vector<xtype>xtype_vec;
public:
template<typename T> base* tell_to(T &input) //take object, return (base*)
{
xtype_template.charbuf.resize(sizeof(input));
memcpy(xtype_template.charbuf.data(), (char*)&input, sizeof(input));
xtype_vec.push_back(xtype_template); //push back with template after filling
return (base*)xtype_vec[xtype_vec.size() - 1].charbuf.data(); //pointer to data
}
}xcontainer; //container object
然后调用:
auto ptr = controller.tell_to(type1); //becomes base*
auto ptr2 = controller.tell_to(type2);
您可以通过以下方式访问任一静态大小的序列化对象及其状态:
ptr->tick(); //which will output "im type 1" to console
ptr2->tick() //"im type 2"
但这合法吗?这些序列化版本有实际类型吗?直接使用基指针访问序列化对象是非法还是错误?
最接近的可能答案:由于is_trivially_copyable 上的返回显示为 false,因此在获得基础继承后对象可能无法安全管理。
跟进:这种方法似乎有效,并且摆弄is_trivially_copyable,似乎表明使对象继承方法会使其不安全。然而,基本方法并没有使其不安全,这让我想知道安全性是否仅适用于系统之间的导出、保存到文件或通过网络传输。也许检查只是假设虚拟参考使它们不安全?
跟进 2:如果字符仍然在内存中的同一位置,那么它们的访问方式是否重要?我敢打赌,这种方法唯一真正的问题是存储的对象是否具有在存储后会改变其大小的元素。
【问题讨论】:
-
我想在一个向量(向量)中有一个不同对象的集合。这个想法是存储告诉容器 tick() 应该做什么的函数对象,或者在有意义的情况下泛化对跨类型方法的访问
-
像向量
>objs_owner; ?嗯,我认为我不熟悉这种方法。它不会对物体进行切片? -
看我的回答,我原来的评论是错误的。
-
我不相信这种方法对于我使用它的目的是不安全的。
标签: c++ pointers inheritance