我正在学习如何用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
它们指向相同的地址,但具有不同的值 要使用向量,我使用了以下方法: 向量ContainerProf;作为全局变量 然后在CreationListeEtudiant中: 受过教授的邀请,我返回了这个:
ContainerProf.push_back(prof);
return ContainerProf.back();
我做错了吗?
答案 0 :(得分:1)
DossierProfesseur::Professeur DossierProfesseur::CreationListeProfesseur(){
Professeur prof;
Cours cours;
...
cours = DossierProfesseur::CreationListeCours();
prof.ListeDeCours = &cours;
etudiant = DossierProfesseur:
...
return prof;
}
您在此函数内将cours
创建为本地对象,因此当该函数返回时,cours
将不复存在。但是,您将cours
的地址存放在按值返回的prof
对象中。因此,您要向调用者返回一个对象,该对象包含指向不再存在的对象的指针。试图取消对该指针的引用是灾难性的。
请不要以这种方式使用指针。这使得管理对象的生存期极为困难。