构造不可复制对象的“数组”

时间:2011-05-18 09:25:22

标签: c++ boost stl vector

我有一个不可复制的类(一个线程,所以没有复制语义有意义),我希望有一个很大的“数组”,用非默认的构造函数构造。请注意,该数组是固定大小。

我只能使用带有C ++数组的默认构造函数,除非我单独初始化每个构造函数。

Thread myArray[128];   // uses default constructor - wrong

我可以明确地列出对象构造函数和参数,但这是冗长而丑陋的

Thread myArray[128] = { Thread(params,...), Thread(params,...), ... x 128 ;  // ugly

似乎我不能使用stl向量,因为该对象是不可复制的 - 虽然向量永远不会改变大小。我猜构造函数实际上是在复制!

std::vector<Thread> myVector(128, Thread(params,...));// won't compile

我这样做的方法是使用一系列智能指针和一个初始化循环,但也许我错过了一些东西:

还有其他方式 - 可能是使用升级容器,还是使用不同的容器类型?

4 个答案:

答案 0 :(得分:6)

这看似完全疯狂(可能是),但是......

struct ThreadInitValues{
  // your actual params
  int i;
  float f;
};

struct Thread{
    Thread(int i = _init.i, float f = _init.f)
      : _i(i)
      , _f(f)
    {}

    static ThreadInitValues _init;

private:
    // uncopyable
    Thread(Thread const&);
    Thread& operator=(Thread const& other);

    // your actual member
    int _i;
    float _f;
};

ThreadInitValues Thread::_init;

int main(){
    Thread::_init.i = 5;
    Thread::_init.f = 3.14f;
    Thread arr[128];
}

也许这适合你。 :)当然,您现在需要注意数组是否在多线程代码本身中初始化...

答案 1 :(得分:3)

智能指针的向量,动态地为每个实例 分配,绝对是最简单的方法。否则(我会 只有在绝对必要时才这样做,你可以或多或少 模仿std::vector内部的作用。沿途的东西 以下几行:

union
{
    double just_to_ensure_alignment;
    unsigned char data[ sizeof(Thread) * elementCount ];
} array;

//  construct...
for ( int i = 0; i != elementCount; ++ i )
    new (data + i * sizeof(Thread)) Thread(params,...);

//  access...
Thread& getAt( int i )
{
    return reinterpret_cast<Thread*>( data + i * sizeof(Thread) );
}

(我实际上将它包装在一个类中,如果只是为了能够使用 operator[]代替getAt。)

答案 2 :(得分:1)

对于支持r值引用的新编译器,矢量元素AFAIK不需要可复制。要在不复制的情况下使用它,应该使用128个push_back(每次都创建新对象),因为从一个中创建几个对象是复制:)。

如果这种方式不可用,请尝试使用boost::ptr_vector或std :: vector of boost :: shared_ptr。

答案 3 :(得分:0)

我不是那么大的程序员。但你试过这个吗?

std::vector<YourObject *> temp_Vec;
for(int i=0;i<128;++i)
    temp_Vec.push_back(new YourObject(arguments));