如何使用不可复制类的向量(或不同的容器)?

时间:2015-03-04 17:37:14

标签: c++ multithreading stl noncopyable private-constructor

我有以下代码:

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 );
  }
  ....
}

PrepareLogFileThread继承自使用Thread的{​​{1}}类(我们使用c ++ 98标准....我可以使用pthread)。

这里的问题是auto_ptr的复制构造函数是私有的,这样就不会搞乱执行或其他东西(我不是这个类的作者)。

这里的想法是我创建Thread个对象,PrepareLogFileThreadpush_back,启动它们,然后它们都会在v返回之前完成。

f在析构函数中调用PrepareLogFileThread,以便在那里完成。

但我不能,因为我将pthread_joina一致。

如果没有c ++ 11并更改push_back的复制构造函数,我怎么能这样做?

我正在使用gcc 4.4.6,我可以使用Thread

2 个答案:

答案 0 :(得分:1)

您可以将指针存储到对象中。

std::vector<PrepareLogFileThread*> v;  

你应该注意对象的生命周期。

答案 1 :(得分:1)

标准容器假设它们的元素支持值语义(在您的说法中,包括“可复制” - 以及其他内容)。

一种选择是创建一个不需要这种语义的容器。由于种种原因,这很难。

或者,让您的容器元素成为具有值语义的其他元素,其中值唯一地标识您的PrepareLogFileThread类的实例。这种“某事”的明显选择是指针。例如;

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创建的对象在完成后不会自动销毁。如果不这样做将导致内存泄漏。

另请注意{{1}}不支持值语义,因此不应存储在标准容器中。