刚接触C++,老师给我们布置了一个关于数据处理的大作业,之前一直学C,以前没用过C++,所以对类的认识好模糊….
问题是这样的,原因是有关数据处理,所以本人想用BinaryTree来做这个题,在写基本操作函数碰到了这样的问题:
class BinaryTree{ private: typedef struct info{ std::string Recipe; std::string By; std::string PrepTime; std::string Categories; }Item; typedef struct node{ Item item; struct node *left; struct node *right; }Node; typedef struct tree{ Node *root; int size; }Tree; Node *MakeNode(const Item *information); Node *MakeNode(const Item *information){ ............ } };
本人在类里面定义了结构体Node,并且想以Node为类型构造函数。可是原因是Node是私有的(本人不用pubilc是原因是不知道为什么下意识觉得这样就不算封装了=-=….虽然知道肯定错了,但是还是不知道什么时候该private,什么时候改public),本人不知道怎么定义。最开始本人是这样乱写的:
BinaryTree::Node BinaryTree::*MakeNode()......
然后正常的悲剧了,本人想到内联函数(老师上课稍微提了一下),如上图,发现还是不行。
问一下各位大牛怎么定义Node *MakeNode()呢?
另外在C++里面 有没有其他办法来取代struct来构造树呢?这样算正常的封装吗?
本人有些笨,希望大牛们能解答下本人的疑问,十分感谢~~
哦对了,本人的编译环境是centos7下的vim…
解决方案:20分
首先LZ,MakeNode不是构造函数,你可以查看一下教材中构造函数的定义,构造函数必须和类名一样,且没有返回值。
第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点相似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。
一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外
声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,假如类的全部函数和变量都是private,那就没有任何意义了
第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点相似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。
一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外
声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,假如类的全部函数和变量都是private,那就没有任何意义了
解决方案:40分
类外定义加上作用域操作符“::”即可:BinaryTree::Item BinaryTree::FunctionName(){}。
构造函数的作用就是给类中数据赋初值嘛,所以不用返回值。