“ISO C++禁止在数组new中初始化”:如何直接使用自己的构造函数将模板对象初始化为C++中的数组

“ISO C++禁止在数组new中初始化”:如何直接使用自己的构造函数将模板对象初始化为C++中的数组

问题描述:

因此,我的目的是构建一个具有可定义数量的“SingleBuffers”的“Multibuffer”。存储的类型是免费的,所以我想使用模板出于这个原因。我只是在玩一下。“ISO C++禁止在数组new中初始化”:如何直接使用自己的构造函数将模板对象初始化为C++中的数组

但我不知道如何直接初始化Multibuffer的构造器中的Singlebuffers。 我不会写下完整的类,而是用构造函数来显示问题。在处理模板类时,我在头文件中定义了这两个类,因为它应该完成。

所以我Singlebuffer构造函数如下:

enum BufferState_E 
    { 
    BUFFER_WRITE = 0, 
    BUFFER_READ, 
    BUFFER_FORCED_READ // buffer is forced for reading 
    }; 

    template<typename T> 
    class SingleBuffer 
    { 
    public: 
    /* 
    * Constructor 
    * constructs a Buffer with the concrete data field 
    */ 
    SingleBuffer(unsigned int buffer_size) 
    : entry_ptr_  (new T[buffer_size]()) //default constructor works? 
    , end_entry_ptr_ (&entry_ptr_[buffer_size-1]) 
    { 
     read_entry_ptr_ = &entry_ptr_[0]; 
     write_entry_ptr_ = &entry_ptr_[0]; 
     state_ = BUFFER_WRITE; 
    } 

    private: 
    /* The pointer to the buffer */ 
    T * entry_ptr_; 
    /* the pointers to the entry which is currently read/written */ 
    T *read_entry_ptr_; 
    T *write_entry_ptr_; 
    /* the pointer to the end of the buffer */ 
    T * end_entry_ptr_; 
    /* The state of the buffer */ 
    BufferState_E state_; 
    } 

和我多缓冲构造函数其实例Singlebuffers量(我写的代码有问题的行后注释):

template<typename T> 
    class MultiBuffer : public BufferBase 
    { 
    public: 

    MultiBuffer(unsigned int buffer_size = 2000 // size of one buffer 
       , unsigned char number_of_buffers = 5 // how many buffers are there? 
       , const char* name = "MultiBuffer" 
       ) 
    : buffer_ptr_   (new SingleBuffer<T>[number_of_buffers](buffer_size)) // the problem line! 
    , end_buffer_ptr_  (&buffer_ptr_[number_of_buffers-1]) 
    , buffer_size_  (buffer_size) 
    , number_of_buffers_ (number_of_buffers) 
    { 
     read_buffer_ptr_ = &buffer_ptr_[0]; 
     write_buffer_ptr_ = &buffer_ptr_[0]; 
    } 

    private: 
    /* the normal buffer-pointer */ 
    SingleBuffer<T> *buffer_ptr_; 
    /* the pointer to the end of the buffers */ 
    SingleBuffer<T> *end_buffer_ptr_; 
    /* the pointer to the current read-buffer */ 
    SingleBuffer<T> *read_buffer_ptr_; 
    /* the pointer to the current write-buffer */ 
    SingleBuffer<T> *write_buffer_ptr_; 
    /* the buffer-size */ 
    unsigned int buffer_size_; 
    /* the number of buffers */ 
    unsigned char number_of_buffers_; 
    } 

所以我的编译器总是告诉我:“标准的代码行中”ISO C++禁止初始化array new“。查找“新”的cpp参考并不真正有帮助,其他问题与模板无关。 如果我只是使用默认的构造函数,就像在Singlebuffer初始化中看到的那样,它似乎可以工作,但只要我想将值传递给我自己定义的模板类的构造函数,它就会崩溃。我确实设法强制它在没有直接在Multibuffer-Constructor中初始化的时候进行构建,而是通过一个迭代“缓冲区数量”并在每次迭代中分配内存的循环,但这不是它应该如何工作的,除了我并不真正知道这是否真的没有错误。

而我不想使用std :: - functions,因为我正在开发嵌入式系统。编译器是GCC 4.8.1,也不可更改,并且lambda表达式也不受支持...

我希望会有一种可能性。非常感谢。

+4

请思考[mcve]的**最小**和**完整**方面。 – StoryTeller

+3

支持'new'的嵌入式系统应该支持'std :: vector'就好了。 –

+0

好的,我删除了一个不必要的继承,并添加了BufferState_E-enum。我希望现在好了。它完全符合我的错误。 –

错误消息说明:您不能在new[]中提供初始化。您将不得不稍后分配给这些对象,可能在MultiBuffer::MultiBuffer的主体中。

但是你不应该那样做。您只需使用std::vector即可满足您的动态阵列需求。你的编译器提供它,库编写者知道他们在做什么。 “标准库函数臃肿”并非如此本世纪