我有一个不可复制的类(一个线程,所以没有复制语义有意义),我希望有一个很大的“数组”,用非默认的构造函数构造。请注意,该数组是固定大小。
我只能使用带有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
我这样做的方法是使用一系列智能指针和一个初始化循环,但也许我错过了一些东西:
还有其他方式 - 可能是使用升级容器,还是使用不同的容器类型?
答案 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));