问题是这样的,因为有关数据处理,所以我想用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...
4 个解决方案
#1
首先楼主,MakeNode不是构造函数,你可以查看一下教材中构造函数的定义,构造函数必须和类名一样,且没有返回值。
第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点类似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。
一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外
声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,如果类的所有函数和变量都是private,那就没有任何意义了
第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点类似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。
一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外
声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,如果类的所有函数和变量都是private,那就没有任何意义了
#2
嗯 谢谢了!不过第一点没太明白,构造函数没有返回值?是因为函数和构造函数是2个不同的概念吗?
#3
另外,
我该怎么在外部定义Item FuncitonName(para....)呢?
class BinaryTree{
private:
typedef struct Item{
........
}Item;
public:
Item FuncitonName(para....);
}
我该怎么在外部定义Item FuncitonName(para....)呢?
#4
类外定义加上作用域操作符“::”即可:BinaryTree::Item BinaryTree::FunctionName(){}。
构造函数的作用就是给类中数据赋初值嘛,所以不用返回值。
#1
首先楼主,MakeNode不是构造函数,你可以查看一下教材中构造函数的定义,构造函数必须和类名一样,且没有返回值。
第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点类似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。
一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外
声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,如果类的所有函数和变量都是private,那就没有任何意义了
第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点类似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。
一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外
声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,如果类的所有函数和变量都是private,那就没有任何意义了
#2
嗯 谢谢了!不过第一点没太明白,构造函数没有返回值?是因为函数和构造函数是2个不同的概念吗?
#3
另外,
我该怎么在外部定义Item FuncitonName(para....)呢?
class BinaryTree{
private:
typedef struct Item{
........
}Item;
public:
Item FuncitonName(para....);
}
我该怎么在外部定义Item FuncitonName(para....)呢?
#4
类外定义加上作用域操作符“::”即可:BinaryTree::Item BinaryTree::FunctionName(){}。
构造函数的作用就是给类中数据赋初值嘛,所以不用返回值。