2014-04-19 42 views
0

我一直被困在这一点,无法找到出路它在互联网上搜索的方式。这段代码应该提示用户输入3个不同的字符串,并将它们分配给类的成员变量。从标准输入分配一个字符串到一个类成员变量

void Book::setBookProperty() 
{ 
string name; 
string publisher; 
string category; 
int published_year; 
double price; 

// Prompt for book infromation 
cout << "Name of the Book: "; 
getline(cin, name, '\n'); 
this->name = name; 

cout << "Publisher: "; 
getline(cin, publisher, '\n'); 
this->publisher = publisher; 

cout << "Category: "; 
getline(cin, category, '\n'); 
this->category = category; 

cout << "Published year: "; 
cin >> published_year; 
this->published_year = published_year; 

cout << "Price:"; 
cin >> price; 
this->price = price; 
} 

名称,发布者,类别,published_year和price都是Book类的私有成员。从标准输入分配这些内容我遇到内存访问冲突!我不明白我哪里错了。 有什么帮助吗?

这是怎么这个功能正在从另一个类称为图书城调用:

void BookStore::addBook(int No) 
{ 
book[No].setBookProperty(); 
} 
+0

这可能是这个函数是怎么叫的事。你还可以显示调用代码吗? –

+0

这是一个奇怪的!对于第一个赋值,一切正常,意味着名称被分配给Book类的成员变量NAME。当它进入第二个任务时!弹出错误。 –

+0

我在问题中发布了调用函数! –

回答

0

这是书店是如何定义和预订的对象被内它实例化。

class BookStore 
{ 
public: 
BookStore(string name) 
{ 
    storeName = name; 
    book = new Book[]; 
} 
Book getBook(int); 
void addBook(int); // prompts for information 
private: 
string storeName; 
Book *book; 
}; 

这是怎么这整个被从main函数调用:

int main() 
{ 
BookStore Amazon("amazon"); 
Amazon.addBook(1); 
} 
1

book阵列中,书店有一个长度为零。所以你不能在那里装任何书。当你打电话给addBook(1)时,它会尝试访问book[1],它已经超过了数组的末尾,所以它正在写入它不拥有的内存。

速战速决是一个上限设定为图书的数量:

book = new Book[10]; // book store with only 10 books allowed. 

一个更好的解决办法是在藏书中存储诸如std::vector。然后,您可以检查矢量是否有足够的空间存放要添加的书籍,并根据需要添加额外的空间。

vector<Book> book; 

void BookStore::addBook(int No) 
{ 
    if (book.size() <= No) 
    book.resize(No+1); 

    book[No].setBookProperty(); 
} 

注意两个矢量和阵列从零开始的,这就是为什么你需要调整到No+1

+0

谢谢,我试着快速修复,以限制允许的书籍数量!这次另一个称为断言失败的错误!任何想法? –

+0

不,我需要一些更多的信息 - 它有多深,有什么错误,等等。通过调试器运行它,并逐步通过线路,这将有助于缩小它的范围。 –

相关问题