// header.h
#include <iostream>
#include <list>
#include <fstream>
using namespace std;
class Biblioteca
{
public:
Biblioteca();
void closeFile();
bool chose();
ofstream Intrare;
ofstream Memorare;
};
class Publicatii:public virtual Biblioteca
{
public:
string retTitlu();
string retEditura();
string retAutor();
int retAn();
int retTiraj();
int retNumar();
int retFrecventa_de_aparitii();
protected:
string Titlu, Editura, Autor;
int An, Tiraj, Numar, Frecventa_de_aparitii;
};
class Carti: public Publicatii , public virtual Biblioteca
{
public:
void readBook();
Carti();
void insertMyBook();
void writeBookFile();
void inTitlu(Carti& a);
void inEditura(Carti& a);
void inAutor(Carti& a);
void inTiraj(Carti& a);
void inAn(Carti& a);
protected:
list<Carti*>books;
list<Carti*>::iterator i;
};
class Reviste: public Publicatii , public virtual Biblioteca
{
public:
void readMagazine();
Reviste();
void insertMyMagazine();
void writeMagazineFile();
protected:
list<Reviste*> magazine;
list<Reviste*>::iterator j;
};
标头的另一个cpp文件
#include<iostream>
#include<string>
#include"biblioteca.h"
#include <list>
#include<fstream>
//-----Biblioteca------
Biblioteca::Biblioteca()
{
Memorare.open("in.txt");
}
void Biblioteca::closeFile()
{
Memorare.close();
}
bool Biblioteca::chose()
{
int k;
cout << "Ce doriti sa introduceti?" << endl << endl;
cout << "1--Carte" << endl;
cout << "2--Biblioteca" << endl;
cin >> k;
switch (k)
{
case 1:
return true;
break;
case 2:
return false;
break;
}
}
//-------Publicatii------
string Publicatii::retTitlu()
{
return Titlu;
}
string Publicatii::retEditura()
{
return Editura;
}
string Publicatii::retAutor()
{
return Autor;
}
int Publicatii::retAn()
{
return An;
}
int Publicatii::retTiraj()
{
return Tiraj;
}
int Publicatii::retNumar()
{
return Numar;
}
int Publicatii::retFrecventa_de_aparitii()
{
return Frecventa_de_aparitii;
}
//---------Carti---------
void Carti::inTitlu(Carti& a)
{
Titlu = a.retTitlu();
}
void Carti::inEditura(Carti& a)
{
Editura = a.retEditura();
}
void Carti::inAutor(Carti& a)
{
Autor = a.retAutor();
}
void Carti::inTiraj(Carti& a)
{
Tiraj = a.retTiraj();
}
void Carti::inAn(Carti& a)
{
An = a.retAn();
}
void Carti::readBook()
{
cout << "\nO noua carte" << endl<<endl;
cout << "\nTitlu= ";
cin >> Titlu;
cout << "\nEditura= ";
cin >> Editura;
cout << "\nAn= ";
cin >> An;
cout << "\nTiraj= ";
cin >> Tiraj;
cout << "\nAutor= ";
cin >> Autor;
}
Carti::Carti()
{
books.resize(1);//one book
}
void Carti::insertMyBook()
{
Carti carti;
for (i = books.begin(); i != books.end(); i++)
{
carti.readBook();
(*i)->inTitlu(carti);
(*i)->inEditura(carti);
(*i)->inAn(carti);
(*i)->inTiraj(carti);
(*i)->inAutor(carti);
//books.insert(i, *i);
}
}
void Carti::writeBookFile()
{
Memorare << "---Carti---" << endl;
for (i = books.begin(); i != books.end(); i++)
Memorare << *i << " ";
}
//-------Reviste--------
void Reviste::readMagazine()
{
cout << "\nO noua revista" << endl<< endl;
cout << "\nTitlu= ";
cin >> Titlu;
cout << "\nEditura= ";
cin >> Editura;
cout << "\nAn= ";
cin >> An;
cout << "\nTiraj= ";
cin >> Tiraj;
cout << "\nNumar= ";
cin >> Numar;
cout << "\nFrecventa de aparitie= ";
cin >> Frecventa_de_aparitii;
}
Reviste::Reviste()
{
magazine.resize(1);//one magazine
}
void Reviste::insertMyMagazine()
{
Reviste reviste;
for (j = magazine.begin(); j != magazine.end(); j++)
{
reviste.readMagazine();
//some conde
magazine.insert(j, *j);
}
}
void Reviste::writeMagazineFile()
{
Memorare << "---Reviste---" << endl;
for (j = magazine.begin(); j != magazine.end(); j++)
cout << *j << " ";
}
抱歉,这里的代码太少了,我是Stackoverflow的新手,所以我很着急,这就是为什么我不编写“漂亮的代码”。我的问题是,当我只想在列表中插入元素时
void Carti::insertMyBook()
{
Carti carti;
for (i = books.begin(); i != books.end(); i++)
{
carti.readBook();
(*i)->inTitlu(carti);
(*i)->inEditura(carti);
(*i)->inAn(carti);
(*i)->inTiraj(carti);
(*i)->inAutor(carti);
books.insert(i, *i);
}
}
它像发条一样工作,编译后,我从键盘上输入了一些信息,最后我得到一个大错误,例如“ Acces Violation Reading 00000001C”
为什么?我尝试了其他方法,例如使用new运算符分配动态内存,我尝试了很多方法,但最终我还是遇到了此错误,或者键入“ example”与“ example”不匹配。
对不起,我的英语拼写错误,但是在这个程序中,我只想制作一个程序,用于阅读杂志和书,并存储到名为“ biblioteca”的图书馆中,“ carte”表示书籍,“ Reviste”表示杂志...而我希望将其存储在列表中,因为我需要插入元素或删除我选择的书籍或杂志...以及所有要保存在文件中的信息,例如“ out.txt”或“ in.txt” ”
最佳答案
崩溃是因为迭代器在行NULL
处是(*i)->inTitlu(carti);
。
问题出在方法上:
Carti::Carti()
{
books.resize(1);//one book
}
书是:
list<Carti*>books;
您要尝试将Carti列表的大小调整为1,但是由于您有一个指向Carti对象而不是Carti对象的指针列表,因此调整大小的操作不会通过调用其构造函数而是通过指针来创建Carti对象。
除了您在设计和编码方面存在重大问题之外,存储一个其他Carti指针列表的Carti对象绝对不是一个好主意。您可以考虑创建另一个“持有”类来存储您创建的Carti列表。