我有一些指针有问题,调试结束时访问位置失败

时间:2014-03-17 13:04:45

标签: c++ list pointers stl

// 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的新手,我匆忙,这就是为什么我不写“美丽的代码”#34; 。我的问题是,当我想在我的列表中插入元素时

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);
    }
} 

它像发条一样工作,在编译之后我从键盘输入一些信息,最后我得到了一个很大的错误,例如&#34; Acces Violation Reading 00000001C&#34; 为什么?我尝试了其他方法,例如使用new运算符分配动态内存,我尝试了很多东西,但最后我喜欢这个错误或输入&#34;示例&#34;与&#34;示例&#34;不匹配。 对不起我的英文拼写错误,但在这个程序中,我只是想制作一个程序,读取杂志和书籍并存储到名为&#34; biblioteca&#34;和&#34; carte&#34;意思是书和&#34; Reviste&#34;意味着杂志...我希望它被记忆在列表中,因为我需要插入元素或删除我选择的书籍或杂志......以及我想要保存在文件中的所有信息,例如&#34 ; out.txt&#34;或&#34; in.txt&#34;

1 个答案:

答案 0 :(得分:3)

崩溃是因为第NULL行的迭代器是(*i)->inTitlu(carti);

问题在于方法:

Carti::Carti()
{
    books.resize(1);//one book
}

和书籍是:

list<Carti*>books;

您要尝试的是将Carti列表的大小调整为1,但是因为您有指向Carti对象的指针列表而不是 Carti对象 ,调整大小操作不会通过调用它的构造函数而是指针来创建Carti对象。

除了你的设计和编码存在重大问题之外,存储其他指针到Carti对象列表的Carti对象绝对不是一个好主意。您可以考虑创建另一个“持有”&#39;用于存储您创建的Carti列表的类。