为什么要return &(book->base), 最后返回的到底是什么
时间: 2024-04-12 12:33:42 浏览: 11
返回`&(book->base)`是为了返回一个指向`TBase`类型对象的指针。
在函数开始时,我们通过`malloc`函数为`TBook`对象分配了内存空间,并将其地址赋给了`book`指针。然后,我们使用`InitBase`函数初始化了`TBook`对象的`base`成员。
在函数的最后,我们将`book->base`的地址返回。这样做的目的是允许调用者通过返回的指针来访问和操作`TBase`对象的成员。因为`TBase`是`TBook`结构体的第一个成员,所以返回`&(book->base)`实际上就是返回整个`TBook`对象的地址。
通过返回一个指向基类类型的指针,可以实现向上转型的效果。也就是说,调用者可以将返回的指针转换为基类类型的指针,然后通过基类类型的指针来调用基类的方法或访问基类的成员。这样做可以实现多态性,提高代码的灵活性和可复用性。
相关问题
TBase* CreateBook(struct TScene* scene, int x, int y) { TBook* book = (TBook*)malloc(sizeof(TBook)); InitBase(&(book->base), E_BOOK, "\033[0;34m册\033[0m", x, y, BookCollionCB);// book->scene = scene; return &(book->base); }
这段代码是一个函数定义,名为CreateBook,其返回类型为TBase*,接受三个参数:一个指向TScene结构的指针scene,以及两个整数x和y。
函数的主要功能是创建一个TBook对象,并初始化它的成员变量。首先,通过malloc函数为TBook对象分配内存空间,分配的大小为TBook的大小。然后,使用InitBase函数初始化TBook对象的base成员,base是TBase结构的一个实例。InitBase函数接受多个参数,包括base的指针、E_BOOK作为类型、"\033[0;34m册\033[0m"作为名称、x和y作为位置坐标,以及BookCollionCB作为碰撞回调函数。
接下来,将scene指针赋值给book的scene成员变量。最后,返回book的base成员的指针。
需要注意的是,这段代码中使用了类型转换将malloc返回的void指针转换为TBook指针。在使用malloc函数分配内存时,需要确保所分配的内存足够容纳TBook对象的大小。在使用完TBook对象后,记得使用free函数释放所分配的内存空间,以避免内存泄漏。
#include<iostream> #include<string> #include<vector> #include<map> #include<iomanip> #include <list> using namespace std; class item { public: string name;//书名 string item_type;//项目类型 bool Register;// }; //杂志类 class magazine :public item//类的继承 { string Type; string Writer; }; //MusicCd类 class MusicCd :public item { string Singer; }; //电影类 class Movie :public item { string Type; string Director; string Actor; }; //书籍类 class Book : public item { public: Book() { borrow_flag = false; } //无参构造函数 Book(string name, string num, string auther) :name(name), num(num), auther(auther) { borrow_flag = false; } //有参构造函数 void setReader(string reader, int lcn, string data); //设置读者 void setInfo(string name, string num, string auther); //设置书籍信息 string getName() { return name; } string getNum() { return num; } string getAuther() { return auther; } bool getBorrow_flag() { return borrow_flag; } string getReader() { return reader; } int getLcn() { return lcn; } string getData() { return data; } bool isBorrow() { return borrow_flag; } //判断书籍是否借出 void setBorrow_flag(bool b) { borrow_flag = b; } void showInfo(); //显示数据信息 private: string name; //书名 string num; //编号(唯一标示) string auther; //作者 bool borrow_flag; string reader; //读者 int lcn; //借书证号 string data; //借书日期 }; //DVD电影类 class DVD :public Movie { }; //蓝光电影类 class Blue_ligh :public Movie { }; //用户 class Person { public: string Name; string Adress; list<item> Regist_items; }; void Book::setReader(string reader, int lcn, string data) { borrow_flag = true; this->reader.assign(reader); this->lcn = lcn; this->data.assign(data); } void Book::setInfo(string name, string num, string auther) { this->name.assign(name); this->num.assign(num); this->auther.assign(auther); } void Book::showInfo() { cout << "书籍名称:" << setiosflags(ios_base::left) << setw(56) << name << endl << "书籍编号:" << setw(56) << num << endl << "书籍作者:" << setw(56) << auther << endl;//setw()输出字符宽度 if (borrow_flag) { cou
t << "借书人:" << setw(56) << reader << endl << "借书证号:" << setw(56) << lcn << endl << "借书日期:" << setw(56) << data << endl; } else { cout << "该书籍未被借出" << endl; } } int main() { Book b1("C++ Primer", "001", "Lippman"); b1.showInfo(); b1.setReader("Tom", 123456, "2022-05-01"); b1.showInfo(); return 0; }
这段代码定义了一个图书管理系统的基本功能,其中包括了不同类型的物品类(杂志类、音乐CD类、电影类、书籍类、DVD电影类、蓝光电影类),以及用户类。其中,书籍类中包括了书籍的名称、编号、作者等属性,并且可以设置借书人、借书证号和借书日期等信息。在主函数中,定义了一本书籍,并且展示了其基本信息,以及设置了借书人、借书证号和借书日期等信息,并且再次展示了其信息。