【问题标题】:Assigning a string from standard input to a class member variable将标准输入中的字符串分配给类成员变量
【发布时间】:2014-04-19 00:35:57
【问题描述】:

我一直被困在这个问题上,在互联网上搜索找不到解决办法。这段代码应该提示用户输入 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 类的私有成员。从标准输入分配那些我得到内存访问冲突!我不明白我哪里出错了。 有什么帮助吗?

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

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

【问题讨论】:

  • 这可能与这个函数的调用方式有关。能否也显示调用代码?
  • 这有点奇怪!对于第一个赋值,一切正常,这意味着 name 被赋值给类 Book 的成员变量 NAME。当它进入第二个任务时!错误弹出。
  • 我把调用函数贴在了qustion里面!
  • BookStore::book 的定义是什么,它是如何分配的?如果book[No] 不是有效的Book 对象,那么在其上调用setBookProperty() 将解决您遇到的内存错误。请提供SSCCE 证明您正在尝试做的事情。
  • 在下面发布了定义作为答案。

标签: c++ string class


【解决方案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

【讨论】:

  • 谢谢,我尝试了快速修复来限制允许的书籍数量!这次另一个错误称为断言失败!有什么想法吗?
  • 不,我需要更多信息——它完成了多远,错误说了什么等等。通过调试器运行它并逐行遍历,这将有助于缩小范围。
【解决方案2】:

这就是 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);
}

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2015-05-04
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2017-10-28
    相关资源
    最近更新 更多