Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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++基础类中成员的初始化,直到执行派生类的CtoR?_C++ - Fatal编程技术网

如何延迟C++基础类中成员的初始化,直到执行派生类的CtoR?

如何延迟C++基础类中成员的初始化,直到执行派生类的CtoR?,c++,C++,以下是场景: 我想定义一个基类,为所有派生类分配一次缓冲区,而缓冲区的大小在不同的派生类之间有所不同。我可以这样做: class base { public: base():size(), p_array(0){} private: size_t size; boost::shared_array<unsigned char> p_array; }; 但是,为了简化派生类的设计,我真的想说: p_array.reset(new unsigned ch

以下是场景: 我想定义一个基类,为所有派生类分配一次缓冲区,而缓冲区的大小在不同的派生类之间有所不同。我可以这样做:

class base
{
public:
     base():size(), p_array(0){}
private:
     size_t size;
     boost::shared_array<unsigned char> p_array;

};
但是,为了简化派生类的设计,我真的想说:

p_array.reset(new unsigned char[size]);
到基类中的某个地方,因此只编写一次。有没有C++设计模式可以实现它?
谢谢。

对不起,为什么有两个阵列和两种尺寸?现在,如果你创建一个派生类,你有一个2倍于p_数组。我认为编译器应该在这方面给出一个错误

你不想要这个吗

class base
{
public:
     base():size(), p_array(0){}
     base(size_t array_size):size(array_size)
     {
          p_array.reset(new unsigned char[size]);
     }
private:
     size_t size;
     boost::shared_ptr<unsigned char> p_array;

};

class derived
{
public:
     derived(size_t array_size):base(array_size)
     {
     }
private:
};

您可以将大小传递给基类的构造函数:

class base
{
   base(size_):size(size_), p_array(new char[size_]) {}
}
派生类决定大小,但它需要在基本构造时知道大小:

class largebufferderived : public base
{
   public:
     largebufferderived() : base(77220) {}
}
或者,您可以按需初始化缓冲区,这在多线程场景中并不总是一个好主意:

boost::shared_ptr<char> Buffer() 
{
   if (!p_Array)
     p_array.reset(new unsigned char[size]);
}
使p_数组在基类中私有,这样派生类只能通过缓冲区访问

或者,只需添加FinalConstruct方法来调用派生类构造函数。这并没有避免调用它,但至少确定了在调用所有构造函数之后需要做什么


顺便说一句,为什么是共享的,而不是共享的数组?

你说得对,我只是复制了基类行,并在绘制派生类时对其进行了修改。更正,谢谢。你的代码有我希望在我的问题中避免的问题。当您将派生类中的值重新分配给成员大小时,已经分配了p_数组,从这一点开始,成员大小不再等于分配的缓冲区大小。您可以使用向量吗?这将使这个问题更容易解决,因为我需要将它转换为C指针,以便输入C风格的Win32 API。事实上,我正在用C++包装这个API。向量是动态的,但它们不会自然地转换为C数组。实际上,这个答案似乎是正确的,因为p_数组被重置为大小,从派生类传递。这在基类的构造函数中发生,而且只发生过一次。是的,我在打字的时候想到了boost::shared_数组。现在更正。你建议的方式正是我想要避免的。我希望实现这一点:1在基类内分配缓冲区,2在派生类内指定大小。通过在派生类中重置p_数组,该类可以工作,但没有效果,因为1我可能忘了重置它,因此导致缓冲区溢出2。理论上,缓冲区在基类和派生类中分配了两次,并且浪费了第一次。在这两种情况下,重置p_数组是在基类中完成的,而大小是在派生类中确定的。请注意,在第一个示例中,您可以执行依赖于参数的算术运算,甚至可以调用静态函数来确定大小。此外,在建议1中,您不能在不提供初始化大小的构造函数的情况下进行继承,因为显式构造函数隐藏了默认值。第一个建议是我正在寻找的。谢谢在我的例子中,分配的缓冲区必须是公共的,才能作为Win32 API参数访问外部,因此解决方案2在这里不适用。
boost::shared_ptr<char> Buffer() 
{
   if (!p_Array)
     p_array.reset(new unsigned char[size]);
}