更新 class 个变量的值 - C++
Updating value of class variables - C++
我刚开始学习如何编码,但遇到了一个我似乎无法解决的问题。
更具体地说,问题出现在“借用”功能中。
在下面的程序中,我无法更新 public class 变量“stock”的值,即使我使用了 getter 和 setter。
它似乎在 cout 上正确更新但不是“永久保存”。我的猜测是它正在修改变量的副本而不是变量本身。
我已将我的代码附加到 post!如果我应该上传整个文件,请告诉我!
提前致谢!
void Book::borrows() {
int searchid;
bool isfound=false;
cout<<"Please enter the unique ID of the book:\t\t";
cin>>searchid;
for(auto i:myBooks){
if (i.id==searchid){
cout<<"This book matches your search:\t"; print(i);
if (i.stock==0) {
cout<<"Book is out of stock!"<<endl;
} else {
setStock((i.stock-1));
cout<<"Successfully borrowed!! Now there are only "<<getStock()<<" copies left in stock!"<<endl;
}
isfound=true;
}
}
if (isfound== false){
cout<<"++++\t\tBook not found++++\t\t"<<endl;
}
system("pause");
}
int Book::getStock() const {
return stock;
}
void Book::setStock(int newstock) {
Book::stock = newstock;
}
编辑 1:
这是我的 Class 结构和向量:
class Book{
public:
int id;
string title;
int stock;
void add();
void displayall();
void displayspecific();
void print(Book);
void borrows();
void returns();
int getStock() const;
void setStock(int stock);
};
vector<Book> myBooks;
我同意 Thomas Matthews 的评论。您当前的 Book
结构没有意义,因为大多数方法都是针对 Book
的集合而不是特定的 Book
如果您将一组书籍称为 Library
,那么下面的代码对于委派 Book
和 Library
[= 之间完成工作的位置更有意义25=]
#include <string>
#include <vector>
using namespace std;
class Book {
public:
int id;
string title;
int stock;
// These methods operate on this particular Book instance
int getStock() const;
void setStock(int);
};
int Book::getStock() const {
return stock;
}
void Book::setStock(int newstock) {
stock = newstock;
}
class Library {
public:
vector<Book> myBooks;
// These methods operate on the vector of books
void add();
void displayall();
void displayspecific();
//void print(Book); // This method probably belongs inside Book
void borrows();
void returns();
};
int main() {
return 0;
}
根据 Library
方法重写 borrows
意味着对 Library
的 myBooks
向量进行操作。当您在向量中找到您想要的特定 Book
时,您可以调用它的 getter 和 setter,它们应该可以正常工作
解决您的问题,在您当前的代码中,这是迭代您的 Book
并为您提供每个副本:
for(auto i:myBooks)
您希望它获得参考而不是副本:
for(auto& i:myBooks)
您的实际问题是您操作的是 Book 对象的副本,而不是书籍成员的 setter 和 getter。
for(auto i:myBooks){
你需要
for(auto &i:myBooks){
但正如其他人所指出的,您需要 2 类、图书馆和书籍。
我刚开始学习如何编码,但遇到了一个我似乎无法解决的问题。 更具体地说,问题出现在“借用”功能中。
在下面的程序中,我无法更新 public class 变量“stock”的值,即使我使用了 getter 和 setter。 它似乎在 cout 上正确更新但不是“永久保存”。我的猜测是它正在修改变量的副本而不是变量本身。
我已将我的代码附加到 post!如果我应该上传整个文件,请告诉我!
提前致谢!
void Book::borrows() {
int searchid;
bool isfound=false;
cout<<"Please enter the unique ID of the book:\t\t";
cin>>searchid;
for(auto i:myBooks){
if (i.id==searchid){
cout<<"This book matches your search:\t"; print(i);
if (i.stock==0) {
cout<<"Book is out of stock!"<<endl;
} else {
setStock((i.stock-1));
cout<<"Successfully borrowed!! Now there are only "<<getStock()<<" copies left in stock!"<<endl;
}
isfound=true;
}
}
if (isfound== false){
cout<<"++++\t\tBook not found++++\t\t"<<endl;
}
system("pause");
}
int Book::getStock() const {
return stock;
}
void Book::setStock(int newstock) {
Book::stock = newstock;
}
编辑 1:
这是我的 Class 结构和向量:
class Book{
public:
int id;
string title;
int stock;
void add();
void displayall();
void displayspecific();
void print(Book);
void borrows();
void returns();
int getStock() const;
void setStock(int stock);
};
vector<Book> myBooks;
我同意 Thomas Matthews 的评论。您当前的 Book
结构没有意义,因为大多数方法都是针对 Book
的集合而不是特定的 Book
如果您将一组书籍称为 Library
,那么下面的代码对于委派 Book
和 Library
[= 之间完成工作的位置更有意义25=]
#include <string>
#include <vector>
using namespace std;
class Book {
public:
int id;
string title;
int stock;
// These methods operate on this particular Book instance
int getStock() const;
void setStock(int);
};
int Book::getStock() const {
return stock;
}
void Book::setStock(int newstock) {
stock = newstock;
}
class Library {
public:
vector<Book> myBooks;
// These methods operate on the vector of books
void add();
void displayall();
void displayspecific();
//void print(Book); // This method probably belongs inside Book
void borrows();
void returns();
};
int main() {
return 0;
}
根据 Library
方法重写 borrows
意味着对 Library
的 myBooks
向量进行操作。当您在向量中找到您想要的特定 Book
时,您可以调用它的 getter 和 setter,它们应该可以正常工作
解决您的问题,在您当前的代码中,这是迭代您的 Book
并为您提供每个副本:
for(auto i:myBooks)
您希望它获得参考而不是副本:
for(auto& i:myBooks)
您的实际问题是您操作的是 Book 对象的副本,而不是书籍成员的 setter 和 getter。
for(auto i:myBooks){
你需要
for(auto &i:myBooks){
但正如其他人所指出的,您需要 2 类、图书馆和书籍。