Указатели не дают мне ту же ценность - PullRequest
0 голосов
/ 18 октября 2018

Я учусь программировать на C ++ и сталкиваюсь с проблемой: у меня есть структура Professeur, где Cours и Etudiant - это другие структуры (здесь нет проблем):

struct Professeur {
        std::string Nom;
        int Ancien;
        Cours* ListeDeCours;
        Etudiant* ListeDEtudiant;
        Professeur* Suivant;
      };

В моей программе я читаю файл и сохраняю данные в этой структуре.Однако, когда я хочу отобразить информацию, хранящуюся в «Suivant» Professeur, у меня возникает проблема, см .:

Файл данных:

Prof1
1
Cours11
Cours12
Cours13
&
Etudiant11
Etudiant12
Etudiant13
$
Prof2
2
Cours21
Cours22
Cours23
&
Etudiant21
Etudiant22
Etudiant23
$

И вывод:

2
1
1
6304032

Как видите, newprof-> Ancien не дают мне того же значения, и я не знаю почему, поскольку я не изменяю его (я полагаю).Итак, я сделал тестовую программу, где я сам создаю свою структуру, и она отлично работает:

Я искал все, но не знаю, почему это не работает .. Может кто-нибудь взглянуть?Большое спасибо

Вот код, в котором должна быть найдена проблема: test.cpp

ifstream fichier;
vector<DossierProfesseur::Professeur> ContainerProf;
vector<DossierProfesseur::Cours> ContainerCours;
vector<DossierProfesseur::Etudiant> ContainerEtudiant;
DossierProfesseur::DossierProfesseur(string FP){
    fichier.open(FP);
    if (fichier.is_open() ){
        Professeur premier = DossierProfesseur::CreationListeProfesseur();
        tete = &premier;
        Professeur *newprof = DossierProfesseur::getNextProf(tete);

        cout<< newprof->Ancien<<"\n";
        cout<< tete->Ancien<<"\n";
        cout<< tete->Ancien<<"\n";
        cout<< newprof->Ancien<<"\n";
    }
    else{
        printf("Error while openning file");
    }
}

DossierProfesseur::Professeur* DossierProfesseur::getNextProf(DossierProfesseur::Professeur* prof){
    return prof->Suivant;
}


DossierProfesseur::Professeur DossierProfesseur::CreationListeProfesseur(){
    Professeur prof;
    Cours cours;
    Etudiant etudiant;
    if(!fichier.eof()){ //Fin du fichier
        getline(fichier,prof.Nom);
        string ancien;
        getline(fichier,ancien);
        prof.Ancien = stoi(ancien);
        Professeur nextProf = DossierProfesseur::CreationListeProfesseur();
        prof.Suivant = &nextProf;
    }
    else{
        prof.Nom = string();
        prof.Ancien = 0;
        prof.ListeDeCours = NULL;
        prof.ListeDEtudiant = NULL;
        prof.Suivant = NULL;
    }
    ContainerProf.push_back(prof);
return ContainerProf.back();
}

int main()
{
    string dest = "FP.txt";
    DossierProfesseur dos (dest);
    return 0;
}

test.h:

#ifndef DossierProfesseur_h
#define DossierProfesseur_h
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdlib.h>

  class DossierProfesseur
  {
    public:
      DossierProfesseur(std::string FP);

      struct Cours{
        std::string Sigle;
        Cours* Suivant;
      };
      struct Etudiant{
        std::string Sigle;
        Etudiant* suivant;
      };
      struct Professeur {
        std::string Nom;
        int Ancien;
        Cours* ListeDeCours;
        Etudiant* ListeDEtudiant;
        Professeur* Suivant;
      };
      Professeur CreationListeProfesseur();
      Professeur *getNextProf(Professeur *prof);
      Professeur* tete;
    private:


  };
#endif

Редактировать: Используя векторы, яимеют тот же вывод, что и ранее:

2 - 0x7ffe26c10520
1
1
6320480 - 0x7ffe26c10520

Они указывают на один и тот же адрес, но имеют разные значения. Чтобы использовать векторы, я использовал это: vector ContainerProf;как глобальная переменная И затем в CreationListeEtudiant: если я возвращаю проф, я возвращаю это:

ContainerProf.push_back(prof);
    return ContainerProf.back();

Я что-то сделал не так?

1 Ответ

0 голосов
/ 18 октября 2018
DossierProfesseur::Professeur DossierProfesseur::CreationListeProfesseur(){
    Professeur prof;
    Cours cours;
 ...
        cours = DossierProfesseur::CreationListeCours();
        prof.ListeDeCours = &cours;
        etudiant = DossierProfesseur:
 ...
    return prof;
}

Вы создаете cours как локальный объект внутри этой функции, поэтому cours перестанет существовать, когда эта функция вернется.Тем не менее, вы прячете адрес cours внутри объекта prof, который вы возвращаете по значению.Таким образом, вы возвращаете объект вызывающей стороне, который содержит указатель на объект, который больше не существует.Попытка разыменовать этот указатель катастрофична.

Пожалуйста, не используйте указатели таким образом.Это делает управление временем жизни объектов чрезвычайно трудным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...