如何将向量(或不同的容器)与不可复制的类一起使用



我有以下代码:

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继承自使用pthreadThread类(我们使用c++98标准……并且我可以使用auto_ptr)。

这里的问题是Thread的复制构造函数是私有的,所以它不会扰乱执行或其他事情(我不是这个类的作者)。

这里的想法是,我创建我的PrepareLogFileThread对象,push_backv,启动它们,然后它们都在f返回之前完成。

PrepareLogFileThread具有对pthread_join的析构函数调用,因此它在那里结束。

但我不能,因为我按照push_back复制a

如果没有c++11和更改Thread的复制构造函数,我怎么能做到这一点?

我使用的是gcc 4.4.6,我可以使用auto_ptr

标准容器假设它们的元素支持值语义(用你的话说,这包括"可复制"等)。

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

或者,让容器元素是其他具有值语义的元素,其中值唯一标识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不支持值语义,因此不应存储在标准容器中。

您可以存储指向对象的指针。

std::vector<PrepareLogFileThread*> v;  

您应该小心对象的生存期。

相关内容

  • 没有找到相关文章

最新更新