【问题标题】:Prevent calls to default constructor for an array inside class防止调用类内数组的默认构造函数
【发布时间】:2012-09-06 16:42:09
【问题描述】:

在编写偏移数组类时(您的 idx 从假设为 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 的向量。

【问题讨论】:

  • 它必须有自动存储还是可以是动态数组?无论如何,为什么不使用std::vector?编译器可以使它与 C 数组一样高效,而且您不会遇到这个问题。
  • 出于性能原因,我想将其作为数组,但现在我将其更改为 vector。 Tnx

标签: c++ arrays initialization


【解决方案1】:

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

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

另一种方法是使用boost::optionals 的数组,然后您不必关心破坏,只需将新元素分配给它们各自的索引。

【讨论】:

  • 你的解决方案很酷,但对我来说太复杂了。除了 boost:optional,但我猜 T 的向量比 T 的 boost::optional 数组更快,所以我按照 Paul Manta 建议的方式进行了操作。
猜你喜欢
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 2015-10-09
相关资源
最近更新 更多