0

我在 C++ 中制作一个程序,我想要包含vector类型Hilo--> vector<Hilo>,(Hilo是一个包含修改 hilo 属性本身的 boost::thread 的类。)。在文件中创建向量时出现错误:Operaciones。 cpp 中agregarHilo。向量的创建有什么问题?我试过用这些方法创建它:1。

  Hilo * hil = new Hilo(this->contadorHilos,tiempo_vida);
    vecHilos.push_back(hil);

agregarHilo或 2.(正如我之前所说,该向量是在 Operaciones.cpp 的方法中创建的。这是完整的代码)谢谢。

//file: Hilo.h    
#ifndef HILO_H   
#define HILO_H1    
#include <boost/thread.hpp>   
#include <boost/date_time.hpp>    
#include <string>    
using namespace std;    
class Hilo{    
private:    
    int id;    
    string mensaje;    
    int tiempo_vida;    
    boost::thread hilo;    
public: void accion();    
        Hilo(int,int);    
        ~Hilo();    
        void setId(int);    
        int getId() const;    
        void setTiempoVida(int);    
        int getTiempoVida() const;    
        string getMensaje() const;    
};//endif    

//file: Hilo.cpp    
#include "Hilo.h"    
#include <iostream>
Hilo::Hilo(int id,int tiempo_vida){    
    this->id=id;    
    this->tiempo_vida=tiempo_vida;    
    this->hilo=boost::thread(&Hilo::accion,this);}    
Hilo::~Hilo(){}    
void Hilo::accion(){    
    unsigned a=1;    
    boost::posix_time::seconds velocidad_(a);    
    while (this->tiempo_vida>=0){    
        stringstream sstm;    
        sstm<<"Hilo numero:"<<this->id <<" tiempo de vida restante:"<<(this->tiempo_vida--);    
        this->mensaje=sstm.str();    
        boost::this_thread::sleep(velocidad_);}    
}    
void Hilo::setId(int id){    
    this->id=id;}    
int Hilo::getId() const{    
    return this->id;}    
void Hilo::setTiempoVida(int tiempo_vida){    
    this->tiempo_vida=tiempo_vida;}    
int Hilo::getTiempoVida() const{   
    return this->tiempo_vida;}    
string Hilo::getMensaje() const{    
    return this->mensaje;}    

//file: Operaciones.h   
#ifndef OPERACIONES_H    
#define OPERACIONES_H1    
#include "Hilo.h"    
#include <vector>
class Operaciones{    
private:    
    int contadorHilos;
    vector<Hilo> vecHilos;    
public:    
    Operaciones();    
    void agregarHilo(int);    
    void verHilo(int);    
};#endif    

    //file: Operaciones.cpp    
    #include "Operaciones.h"    
    Operaciones::Operaciones(){    
        this->contadorHilos=0;}    
void Operaciones::agregarHilo(int tiempo_vida){    
    vecHilos.push_back(Hilo(this->contadorHilos,tiempo_vida); 
    this->contadorHilos++;    
}    
void Operaciones::verHilo(int hilo){} //en construccion    

//file: Principal.cpp    
#include <iostream>    
#include <cstdlib>    
#include "Operaciones.h"    
using namespace std;    

int main(){    
    bool run=true;    
    int opcion;    
    Operaciones oper;    
    system("clear");    
    while(run==true){    
        cout<<"APLICACION MULTI-HILO\nDigite alguna de las opciones\n1. Crear nuevo hilo\n2.Observar hilo\n3. Salir\n";    
        cin>>opcion;    
        switch(opcion){    
        case 1:    
            system("clear");    
            cout<<"Se va a crear un nuevo hilo\n";    
            cout<<"Digite el tiempo de vida del hilo(segundos)";    
            int tiempo;    
            cin>>tiempo;    
            oper.agregarHilo(tiempo);    
            cout<<"Se ha agregado correctamente";    
            break;    
        case 2:    
            system("clear");    
            cout<<"Se va a observar un hilo\n";    
            break;    
        case 3:    
            system("clear");    
            cout<<"Fin del programa, gracias\n";    
            run=false;   
            break;    
        default:    
            system("clear");    
            cout<<"La opcion que ingreso es incorrecta\n";    
            break;    
        }    
        sleep (1.1);    
        system("clear");    
    }    
    return 0;    
}    
4

1 回答 1

0

我相信你的问题出在线路上vecHilos.push_back(Hilo(this->contadorHilos,tiempo_vida));。在这一行中,您正在创建一个新const Hilo对象,然后将其复制到vecHilos.

您的大部分课程都可以轻松复制,但是boost::thread不可复制:

boost::thread 类负责启动和管理线程。每个 boost::thread 对象代表一个执行线程,或 Not-a-Thread,最多一个 boost::thread 对象代表一个给定的执行线程: boost::thread 类型的对象是不可复制的。

您应该能够通过boost::thread从代码中删除所有实例来验证此行为,然后它应该可以正常编译(除非有其他错误)。

在这种情况下,您需要编写自己的复制(或移动)构造函数Hilo并处理线程的复制/移动。例如(未经测试,可能不是最好的解决方案):

// Move constructor
Hilo::Hilo(Hilo&& old)
  : id(_hilo.id), mensaje(_hilo.mensaje), tiempo_vida(_hilo.tiempo_vida),
    hilo(std::move(_hilo.hilo)) {}
于 2013-09-01T02:33:16.823 回答