如何使用不可复制的矢量(或不同的容器)class?
How to use vector (or different container) with non copyable class?
我有如下一段代码:
void f(){
.....
std::vector<PrepareLogFileThread> v;
for(int i = 0; i < list.length(); ++i){
PrepareLogFileThread a(
list[i],
LOG_TEMPLATE);
a.start();
v.push_back( a );
}
....
}
class PrepareLogFileThread
继承自使用 pthread
的 Thread
class (我们使用 c++98 标准....我可以使用 auto_ptr
).
这里的问题是 Thread
的复制构造函数是私有的,因此不会搞乱执行或其他事情(我不是这个 class 的作者)。
这里的想法是我创建我的 PrepareLogFileThread
个对象,push_back
到 v
,启动它们然后它们都在 f
returns 之前完成.
PrepareLogFileThread
在析构函数中调用了 pthread_join
以便它在那里结束。
但是我不能,因为我复制a
符合push_back
。
如果不使用 c++11 并更改 Thread
的复制构造函数,我该怎么做?
我使用的是 gcc 4.4.6,我可以使用 auto_ptr
。
您可以存储指向对象的指针。
std::vector<PrepareLogFileThread*> v;
您应该注意对象的生命周期。
标准容器假定它们的元素支持值语义(用您的话来说,这包括 "copyable" - 除其他事项外)。
一种选择是创建一个您自己的不需要此类语义的容器。由于各种原因,这很难。
或者,让您的容器元素是具有值语义的其他元素,其中值唯一标识您的 PrepareLogFileThread
class 的实例。这种 "something" 的明显选择是指针。例如;
void f()
{
std::vector<PrepareLogFileThread *> v;
for(int i = 0; i < list.length(); ++i){
PrepareLogFileThread *a = new PrepareLogFileThread(
list[i],
LOG_TEMPLATE);
a->start();
v.push_back( a );
}
}
但是请记住,有必要在向量 v
不复存在之前删除它的元素 - 使用运算符 new
创建的对象在完成后不会自动销毁。否则将导致内存泄漏。
另请注意,std::auto_ptr
不支持值语义,因此不应存储在标准容器中。
我有如下一段代码:
void f(){
.....
std::vector<PrepareLogFileThread> v;
for(int i = 0; i < list.length(); ++i){
PrepareLogFileThread a(
list[i],
LOG_TEMPLATE);
a.start();
v.push_back( a );
}
....
}
class PrepareLogFileThread
继承自使用 pthread
的 Thread
class (我们使用 c++98 标准....我可以使用 auto_ptr
).
这里的问题是 Thread
的复制构造函数是私有的,因此不会搞乱执行或其他事情(我不是这个 class 的作者)。
这里的想法是我创建我的 PrepareLogFileThread
个对象,push_back
到 v
,启动它们然后它们都在 f
returns 之前完成.
PrepareLogFileThread
在析构函数中调用了 pthread_join
以便它在那里结束。
但是我不能,因为我复制a
符合push_back
。
如果不使用 c++11 并更改 Thread
的复制构造函数,我该怎么做?
我使用的是 gcc 4.4.6,我可以使用 auto_ptr
。
您可以存储指向对象的指针。
std::vector<PrepareLogFileThread*> v;
您应该注意对象的生命周期。
标准容器假定它们的元素支持值语义(用您的话来说,这包括 "copyable" - 除其他事项外)。
一种选择是创建一个您自己的不需要此类语义的容器。由于各种原因,这很难。
或者,让您的容器元素是具有值语义的其他元素,其中值唯一标识您的 PrepareLogFileThread
class 的实例。这种 "something" 的明显选择是指针。例如;
void f()
{
std::vector<PrepareLogFileThread *> v;
for(int i = 0; i < list.length(); ++i){
PrepareLogFileThread *a = new PrepareLogFileThread(
list[i],
LOG_TEMPLATE);
a->start();
v.push_back( a );
}
}
但是请记住,有必要在向量 v
不复存在之前删除它的元素 - 使用运算符 new
创建的对象在完成后不会自动销毁。否则将导致内存泄漏。
另请注意,std::auto_ptr
不支持值语义,因此不应存储在标准容器中。