// 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列表。

08-19 01:37