Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类变量赢得';t保留从另一个类传递的2d对象数组中的值_C++_Arrays_Class_Object_2d - Fatal编程技术网

C++ C++;类变量赢得';t保留从另一个类传递的2d对象数组中的值

C++ C++;类变量赢得';t保留从另一个类传递的2d对象数组中的值,c++,arrays,class,object,2d,C++,Arrays,Class,Object,2d,我的主要问题是HeaderArray.h文件的内部。我调用了Library::getBook(),它成功地进入了函数。它调用library::brookbook(int bookNum,Book[][3],int copyNum)成功进入该函数。图书管理员:借阅本中的所有内容都能正常工作。两个showName()函数都显示正确的名称。我的问题是当我调用worker2.showBooks()时来自main()。在内部,numbook仍然是0,并且不存在workerbooks。我做错了什么?在这之前

我的主要问题是HeaderArray.h文件的内部。我调用了
Library::getBook()
,它成功地进入了函数。它调用
library::brookbook(int bookNum,Book[][3],int copyNum)成功进入该函数。图书管理员:借阅本
中的所有内容都能正常工作。两个
showName()
函数都显示正确的名称。我的问题是当我调用
worker2.showBooks()时来自
main()
。在内部,
numbook
仍然是0,并且不存在
workerbook
s。我做错了什么?在这之前我试图使用向量,但也有类似的问题。谢谢

main.cpp

#include <iostream>
//#include "Header.h" //Tried using vectors here
#include "HeaderArray.h"
using namespace std;

int main(){
Library lib; //Create library
Librarian headLib;
Librarian worker1;
Librarian worker2;
int choice = 0;
//some code
//some code
//some code
cout << "What would you like to do?\n1) Borrow copy of a book\n2)Return a copy of a book\n";
        cin >> choice;
        if (choice == 1){//Display books can borrow
            cout << "Choose a book to borrow or press 0 to return:\n";
            //worker2.showBooks();
            lib.showBooks(); //WORKS
            cin >> choice;
            if (choice == 0){
                continue;
            }
            else{
                lib.getBook(choice, worker2);
                cout << "MAIN: After rent book\n";
                worker2.showBooks();
            }
        }
system("pause");
return 0;
}
#包括
//#在此处使用向量包括“Header.h”//trued
#包括“HeaderArray.h”
使用名称空间std;
int main(){
库lib;//创建库
图书馆员赫德利卜;
图书馆员1名;
图书馆员2名;
int-choice=0;
//一些代码
//一些代码
//一些代码
选择;
如果(choice==1){//可以借书
选择;
如果(选项==0){
继续;
}
否则{
lib.getBook(选择,worker2);

cout这里的问题是,您将
Library
对象按值传递给
Library::getBook
函数。按值传递意味着复制该对象,并且在函数内所做的所有更改将仅在副本上进行。您应该知道,修改副本不会修改原始副本

您需要通过引用传递
图书管理员
对象:


你知道你在
图书管理员::showBooks
功能中出现了一个off-by-one错误吗?是的,我想提一下。我真的
我谢谢!我在通过引用或指针传递
图书
,但完全忽略了尝试使用
图书管理员
对象。谢谢你提醒我要经过也很有价值!
/******************** Book *******************/
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Book{
private:
    string name;
    //int numCopies;
public:
   Book();
   void setName(string); //Mutator Function
   string getName();
   void showName();
};

Book::Book(){
    /*static int a = 1;
    a++;*/
}

void Book::setName(string n){
    name = "Book " + n;
}

string Book::getName(){
    return name;
}

void Book::showName(){
     cout << name << endl;
}


/******************** Librarian **************/
class Librarian{
    private:
        Book workerBooks[10];
        int numBooks;
    public:
        Librarian();
        void showBooks();
        void borrowBook(int, Book[][3], int);
};

Librarian::Librarian(){
    numBooks = 0;
}

void Librarian::showBooks(){
    cout << "In librarian showBooks\n";
    cout << "numBooks: " << numBooks << endl;
    //cout << "workerBooks empty? " << workerBooks.empty() << endl; //True if empty
    string name;
    for (unsigned int i = 0; i <= numBooks; i++){
        name = workerBooks[i].getName();
        //workerBooks[0].showName();
        cout << "Book name: " << name << "  Total Books: " <<  sizeof(workerBooks) / sizeof(workerBooks[0]) << endl;
   }
}

void Librarian::borrowBook(int bookNum, Book book[][3], int copyNum){
    cout << "In Librarian borrowBook\n";
    book[bookNum][copyNum].showName(); //Shows correct name
    //Book *temp = &book[bookNum][copyNum];
    //workerBooks[numBooks] = *temp;
    workerBooks[numBooks] = book[bookNum][copyNum];
    workerBooks[numBooks].showName(); //Shows correct name
    numBooks++;
    cout << "After Librarian borrowBook\n";
}

/***************** Library Class ****************/

class Library{

private: //cannot be accessed by programming statements outside of the class
    Book books[10][3];
    //Book **books;//1st * gives access to 1st dimension, 2nd * to 2nd dimension of array
protected:  //Can be accessed by inherited classes
public: //CAN be accessed by code outside the class
    Library(); //Constructor
    void getBook(int, Librarian);
    void showBooks();
};

Library::Library(){ //Constructor
    for (int i = 0; i < 10; i++){ //Library has 10 books
        for (int j = 0; j < 3; j++){ //Each book has 3 copies
            books[i][j].setName(to_string(i));
        }
    }
}

void Library::showBooks(){

    string name;
    //sizeof returns size of array in bytes.  To get length of array, divide that size by size of elements inside array
    for (unsigned int i = 0; i < sizeof(books) / sizeof(books[0]); i++){ //Library has 10 books
        for (unsigned int j = 0; j < sizeof(books[0]) / sizeof(books[0][0]); j++){ //Each book has 3 copies
            name = books[i][j].getName();
        }
        cout << i + 1 << ": " << name << "  Available: " << sizeof(books[0]) / sizeof(books[0][0]) << endl;
    }
}

void Library::getBook(int choice, Librarian worker){

    int numCopies = sizeof(books[choice]) / sizeof(books[0][0]);
    if (numCopies == 0){ //If no more copies of the book left
        cout << "We are out of those books.\n";
    }
    else{
        //can't pass entire array as an argument to function. Can pass a pointer to an array by specifying the array's name without an index.
        worker.borrowBook(choice, books, numCopies - 1);

        cout << "After Library getBook \n";
    }
}
void getBook(int, Librarian&);