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

Posted

技术标签:

【中文标题】将标准输入中的字符串分配给类成员变量【英文标题】: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 证明您正在尝试做的事情。 在下面发布了定义作为答案。 【参考方案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);

【讨论】:

以上是关于将标准输入中的字符串分配给类成员变量的主要内容,如果未能解决你的问题,请参考以下文章

Java中的作用域有哪些

java中的作用域有哪些?

将 ResultSet 分配给类中的变量

通过智能指针分配给类成员

如何将另一个文件中的变量分配给类常量?

java中成员变量和局部变量在内存中的分配