将标准输入的字符串分配给类成员变量

时间:2014-04-19 00:35:57

标签: c++ string class

我一直陷入困境,无法找到解决方案。这段代码应该提示用户输入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;
}

name,publisher,category,published_year和price都是Book Book的私有成员。从标准输入分配那些我得到内存访问违规!我不知道哪里出错了。 有什么帮助吗?

这就是从另一个名为BookStore的类调用此函数的方法:

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

2 个答案:

答案 0 :(得分:1)

BookStore中的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的原因

答案 1 :(得分:0)

这就是如何定义BookStore并在其中实例化Book的对象。

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

这就是从主函数调用整体的方式:

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