阻止调用类中的数组的默认构造函数

时间:2012-09-06 16:42:10

标签: c++ arrays initialization

在写一个偏移数组类时(你的idxs从100开始变为1000,所以你创建的类考虑到了这一点而不浪费阵列中的前100个插槽)我遇到了问题。
如何初始化一个具有C数组元素的类(问题是T没有def构造函数)。基本上我希望阵列完全不受限制。例如:

class MyClass
{
    MyClass(int i)
    {

    }
};
template <typename T, size_t n, size_t offset>
struct offsetedIdxArray
{
    T data[n];// error line : error C2512: 'MyClass' : no appropriate default constructor available
    offsetedIdxArray()
    {

    }
    T& operator [](size_t pos)
    {
        return data[(pos-offset)];
    }

};

用法:

offsetedIdxArray<MyClass, 1024,offset> oia;

使用def构造函数不是选项,因为我使用的类实际上是库类。

* 编辑:* 与此处描述的问题无关,但事实证明我的宝贵库类没有复制ctor,只需移动ctor,所以我不得不使用unique_ptr的向量。

1 个答案:

答案 0 :(得分:8)

要获得一个静态大小的未初始化的存储部分,您可以使用对齐存储的“无类型”缓冲区,如C ++ 11中的std::aligned_storage<sizeof(T[n]), alignof(T)>::type(在C ++ 03中,您需要使用{{ 1}}并对对齐进行手动更正,或使用char[sizeof(T[n])+something]和编译器扩展指定对齐方式。)

这意味着使用placement new作为构造函数,并使用显式析构函数来进行销毁。由您来跟踪存储的哪些部分具有对象(因此需要销毁)以及哪些部分没有对象(并且不能调用析构函数)。当客户端请求一个根本没有初始化的元素时(由于它应该在的地方没有对象),也可以由你来满足。

另一种方法是使用char[sizeof(T[n])]的数组,然后你不必关心破坏,只需将新元素分配给它们各自的索引。