C++ 我不知道';我不理解多线程游戏中的对象不匹配

C++ 我不知道';我不理解多线程游戏中的对象不匹配,c++,multithreading,object,for-loop,C++,Multithreading,Object,For Loop,我正在开发一个多线程游戏。它有三类: Carte,由多个案例组成的 Batiment,一艘船,几艘船在互相战斗 案例,是地图的基本单元,可与要素链接 每个线程控制一个Batiment对象,看起来一切都很好,但当我试图输出游戏时,在地图中显示表示Batiment的不同线程的id号,这是行不通的。它只打印我在main.cpp中创建的最后一个Batiment,而不是打印每个线程 我在上面停滞了3天 这是我的档案: main.cpp: std::vector<Batiment> bati

我正在开发一个多线程游戏。它有三类:

  • Carte
    ,由多个
    案例组成的
  • Batiment
    ,一艘船,几艘船在互相战斗
  • 案例
    ,是地图的基本单元,可与
    要素
    链接
每个线程控制一个Batiment对象,看起来一切都很好,但当我试图输出游戏时,在地图中显示表示
Batiment
的不同线程的id号,这是行不通的。它只打印我在
main.cpp
中创建的最后一个
Batiment
,而不是打印每个线程

我在上面停滞了3天

这是我的档案:

main.cpp:

std::vector<Batiment> batiments;
for(int i = 0; i < nbrBatiments; i++){ //Ajout des Batiments sur le vecteur
        //Batiment temp = new Batiment(&carte, i);
        Batiment temp(&carte, i);
        batiments.push_back(temp);
    }
    for(int i = 0; i < nbrBatiments; i++){
        if ((rc = pthread_create(&thread[i], NULL, Batiment::launcher, (void *)&batiments[i]))) {
            fprintf(stderr, "error: pthread_create, rc: %d\n", rc); return EXIT_FAILURE;
        }
    }
for(int i = 0; i<this->x; i++){
    for(int j = 0; j<this->y; j++){
        if(this->carte[i][j].libre == false){
            printf("%d", this->carte[i][j].batiment->id);
        }
    }
}
Batiment::Batiment(Carte *carte, int i) {
    this->carteInside = carte;
    do{
        this->x = doRand(0, carte->x);
        this->y = doRand(0, carte->y);
    }
    while(!carteInside->carte[x][y].libre);
    this->id = i;
    this->orientation = doRand(0, 3);
    this->longueur = doRand(2, 4);  
    this->vie = 2*(this->longueur)*(this->longueur);    
    carte->carte[this->x][this->y].libre = false;
    carte->carte[this->x][this->y].batiment = this;
}
Case.h:这里是类的成员,它链接到一个bation对象:

    Batiment *batiment;
我的
Batiment::jouer()
方法只是一种在地图中移动当前对象并拍摄另一个对象的方法。。。当我“cout”调用
jouer()
的对象的当前id时,所描述的问题就发生在这里

Carte.cpp:

std::vector<Batiment> batiments;
for(int i = 0; i < nbrBatiments; i++){ //Ajout des Batiments sur le vecteur
        //Batiment temp = new Batiment(&carte, i);
        Batiment temp(&carte, i);
        batiments.push_back(temp);
    }
    for(int i = 0; i < nbrBatiments; i++){
        if ((rc = pthread_create(&thread[i], NULL, Batiment::launcher, (void *)&batiments[i]))) {
            fprintf(stderr, "error: pthread_create, rc: %d\n", rc); return EXIT_FAILURE;
        }
    }
for(int i = 0; i<this->x; i++){
    for(int j = 0; j<this->y; j++){
        if(this->carte[i][j].libre == false){
            printf("%d", this->carte[i][j].batiment->id);
        }
    }
}
Batiment::Batiment(Carte *carte, int i) {
    this->carteInside = carte;
    do{
        this->x = doRand(0, carte->x);
        this->y = doRand(0, carte->y);
    }
    while(!carteInside->carte[x][y].libre);
    this->id = i;
    this->orientation = doRand(0, 3);
    this->longueur = doRand(2, 4);  
    this->vie = 2*(this->longueur)*(this->longueur);    
    carte->carte[this->x][this->y].libre = false;
    carte->carte[this->x][this->y].batiment = this;
}

问题在于,您通过
Batiment
的构造函数填充
Carte
,但使用的临时对象被破坏,导致指针无效:

为什么? 在此语句中,您将创建一个临时的
bation

   Batiment temp(&carte, i);
您的构造函数显然会在
Carte::Carte[][]
中插入指向新创建对象的指针

不幸的是,您在for循环的块中定义了这个临时变量:

for(int i = 0; i < nbrBatiments; i++){ //Ajout des Batiments sur le vecteur
        Batiment temp(&carte, i);   // <=== L'instance n'existe que le temps d'une itération !! 
        ...
    }
唯一的一点是,某一天需要在某个地方删除该对象。因此,要么在Carte的析构函数中处理这个问题,要么更改vecotr以保留指针,以便以后可以删除所有这些对象


更好的方法是使用
shared\u ptr
,它自己负责内存管理。

你能告诉我们构造函数
Batiment(Carte*pc,int n)
的定义吗?是的,我使用了
Carte->Carte[this->x][this->y]。Batiment=this
传递对象(参见原始帖子)是的,但我将对象复制到循环中的Batiment向量:
batiments.push_back(temp)所以这不是暂时的,对吗?你是对的!我试着把这个物体放进地图里,在我把_推回后,它成功了!所以有一个地址问题。。。再次感谢您的解决方案和建议
 Batiment *temp = new Batiment (&carte, i);