Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 建设";数组";不可复制对象的定义_C++_Boost_Stl_Vector - Fatal编程技术网

C++ 建设";数组";不可复制对象的定义

C++ 建设";数组";不可复制对象的定义,c++,boost,stl,vector,C++,Boost,Stl,Vector,我有一个本质上不可复制的类(一个线程,所以没有意义的复制语义),我想有一个大的数组,用一个非默认构造函数构造。请注意,数组的大小是固定的 我只能使用C++数组的默认构造函数,除非我独立地初始化每一个。 Thread myArray[128]; // uses default constructor - wrong 我可以显式地列出对象构造函数和参数,但这既冗长又难看 Thread myArray[128] = { Thread(params,...), Thread(params,...)

我有一个本质上不可复制的类(一个线程,所以没有意义的复制语义),我想有一个大的数组,用一个非默认构造函数构造。请注意,数组的大小是固定的

我只能使用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
std::vector myVector(128,线程(参数,…);//不会编译
我想这样做的方式是使用一组智能指针和一个初始化循环,但可能我遗漏了一些东西:


还有其他方法吗?可能是使用boost容器,或者使用不同的容器类型

这似乎完全疯狂(而且可能是),但是


也许这对你有好处。:)当然,您现在需要注意数组是否是用多线程代码本身初始化的…

智能指针向量,每个实例都是动态的 分配,绝对是最简单的方式。否则(我会 只有在绝对必要时才这样做),您可以或多或少地 模拟
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) );
}
联合
{
双方头以确保对齐;
无符号字符数据[sizeof(Thread)*elementCount];
}阵列;
//构造。。。
for(int i=0;i!=elementCount;++i)
新的(数据+i*sizeof(线程))线程(参数,…);
//访问。。。
线程和getAt(inti)
{
返回reinterpret_cast(数据+i*sizeof(线程));
}
(事实上,我会将其包装在一个类中,如果只是为了能够使用
operator[]
而不是
getAt

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


如果这种方法不可用,请尝试使用std::vector of boost::shared\u ptr。

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

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

对于(int i=0;i使用智能指针似乎是明智之举。我认为没有更好的方法。如果它们是“相同构造”的,您不能添加一个默认构造函数来实现这一点吗?否则使用@Space_C0wb0y。Qt库是一个非常著名的库,它们处理不可复制对象的数组(GUI小部件,完全不可复制)因此,我猜想智能指针是前进的方向。即使你不能添加默认构造函数,你也可以得出:派生类可以有一个默认构造函数,它将所需的参数传递给<代码>线程< /COD>构造函数。然后创建默认类的数组。智能指针的tor。注意:MSVC错误地尝试在复制省略时访问复制ctor,即使它应该访问移动ctorHmm。但是
myVector(128,线程(参数,…)不会)
constructor仍然需要进行复制?毕竟,我只传入一个对象,我希望创建128个…+1。但我认为智能指针数组更习惯,更易于阅读。智能指针会更安全。例如boost::scoped_ptr。谢谢。我最终使用了boost::shared_ptr数组
std::vector<YourObject *> temp_Vec;
for(int i=0;i<128;++i)
    temp_Vec.push_back(new YourObject(arguments));