首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建具有默认构造函数的未初始化项数组?

创建具有默认构造函数的未初始化项数组?
EN

Stack Overflow用户
提问于 2015-03-12 01:37:10
回答 2查看 1.2K关注 0票数 3

给定一个类Foo,它具有一些值初始化默认构造函数:

代码语言:javascript
运行
复制
class Foo {
private:
    uint32_t x;

public:
    constexpr Foo()
        : x { 3 }
    {}
    // ... and some other constructors
};

我需要分配这些Foo的数组,我不希望数组的默认构造函数运行,因为以后我将显式地初始化每个元素。就像这样:

代码语言:javascript
运行
复制
Foo foos[20000];

for (int i = 0; i < 20000; ++i) {
    foos[i] = init(i);
}

考虑到我们不允许将Foo的默认构造函数更改为非初始化的构造函数,是否有一种方法可以获得这样一个未初始化的Foo数组?

顺便说一句,这就是如何在D中创建一个未初始化的数组:

代码语言:javascript
运行
复制
Foo[20000] foos = void;

...and在锈蚀中也是一样的:

代码语言:javascript
运行
复制
let mut foos: [Foo; 20000] = unsafe { std::mem::uninitialized() };
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-12 03:00:41

也许这能更准确地回答眼前的问题?

代码语言:javascript
运行
复制
#include <type_traits>

class Foo {
private:
    uint32_t x;

public:
    constexpr Foo()
        : x { 3 }
    {}

    constexpr Foo(uint32_t n)
        : x { n * n }
    {}
};

    // ...and then in some function:

    typename std::aligned_storage<sizeof(Foo), alignof(Foo)>::type foos[20000];

    for (int i = 0; i < 20000; ++i) {
        new (foos + i) Foo(i);
    }

缺点似乎是,您只能使用构造函数来初始化这些元素,而不能使用空闲函数或其他任何东西。

问:那么我能像这样访问那些Foo吗?

代码语言:javascript
运行
复制
    Foo* ptr = reinterpret_cast<Foo*>(foos);
    ptr[50] = Foo();
票数 2
EN

Stack Overflow用户

发布于 2015-03-12 01:40:46

如果您使用C++11,您可以使用std::vectoremplace_back()

代码语言:javascript
运行
复制
vector<Foo> foos;
for(int i = 0; i < 20000; ++i)
    foos.emplace_back( /* arguments here */);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29000519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档