Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型转换指针构造函数调用_C++_Constructor_Casting - Fatal编程技术网

C++ 类型转换指针构造函数调用

C++ 类型转换指针构造函数调用,c++,constructor,casting,C++,Constructor,Casting,我正在类型转换一个类以使用另一个类设置的存储。我想在执行类型转换时调用第一个类的构造函数。有没有办法做到这一点 考虑以下代码: class A{ int x; public: A() {x = 0;} }; class B{ double x; public: B() {x =0.0f;} }; B * bObj = new(); A * aObj = reinterpret_cast < A * > ( bObj ); /

我正在类型转换一个类以使用另一个类设置的存储。我想在执行类型转换时调用第一个类的构造函数。有没有办法做到这一点

考虑以下代码:

class A{
      int x;
public:
      A() {x = 0;}
};

class B{
      double x;
public:
      B() {x =0.0f;}
};

B * bObj = new();
A * aObj = reinterpret_cast < A * > ( bObj );     //Just for the sake of explaining
A类{
int x;
公众:
A(){x=0;}
};
B类{
双x;
公众:
B(){x=0.0f;}
};
B*bObj=new();
A*aObj=重新解释铸件(bObj)//只是为了解释
现在,aObj引用分配给bObj的内存并使用它并将其内容存储在那里。 我试图在执行类型转换时或之后调用类的构造函数。请帮忙


我想使用aObj和要调用的构造函数。但事实并非如此aObj无疑是在分配内存,但是构造函数调用不会发生。它里面填充了垃圾值

我正在学习C++,并试图将对象存储在通用缓冲区中。(bObj在上面的代码片段中充当缓冲区)。aObj确实有内存访问,但构造函数调用没有发生,这正是我试图实现的

听起来你需要仔细阅读placement
new
。有关使用的一些背景和示例,请参见和

请记住,正确使用placement
new
需要小心。很容易弄错,最终以失败告终


特别是,您需要重新考虑如何分配缓冲区。

B
对象的存储中构造
A
对象通常是未定义的行为

当type
B
是一个
char
数组,而不是一个具有构造函数的类时,您可以(使用一个新表达式)执行此操作,但它几乎不需要,仅适用于专家,并且需要手动调用
a
对象的析构函数

如果您只是想节省内存,那么您可以

  • 忽略内存使用情况。
    对于今天的计算机来说,这通常是最好的解决方案

  • 使用派生类和虚拟成员函数

  • 在最坏的情况下,使用带标签的
    接头

    “标记”表示存在类型标识值,即类型“标记”

如果您试图为PIMPL习惯用法节省执行时间

  • 量。也许避免动态分配和间接寻址并不是那么重要

如果还有其他问题,请说明。

您能描述一下您试图解决的实际问题吗?“并且其中填充了垃圾值。”如果是,因为您通过使用
重新解释cast
的方式调用UB。请解释为什么你认为你需要这么做……NPE:我正在学习C++,并试图将对象存储在一个通用缓冲区中。(bObj在上面的代码片段中充当缓冲区)。aObj确实有内存访问权限,但构造函数调用没有发生,这正是我试图实现的。强制转换运算符不调用目标类型的构造函数。你的假设是错误的。@πάνταῥεῖ : 同意。我试图以某种方式完成构造函数调用。有什么办法吗?@Cheersandhth。-阿尔夫:我觉得你的评论有误导性。Placement
new
可能是解决上述问题的最佳工具(“将对象存储在通用缓冲区中”)。我认为我们不应该判断OP的资质,也不应该为他们决定应该允许他们使用哪些工具。你的回复评论具有误导性。所述问题不是“将对象存储在通用缓冲区中”。@NPE tx寻求帮助!我真的很感激。NPE最初建议的新工作对我来说很好。也感谢您的输入。@user3368334:它可能看起来“有效”,但它是未定义的行为。这意味着墨菲先生会在最不方便的时候来拜访你。