关于C++中在类中使用结构体定义的问题

C++语言 码拜 9年前 (2015-10-21) 2313次浏览
刚接触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,那就没有任何意义了
解决方案:40分

类外定义加上作用域操作符“::”即可:BinaryTree::Item BinaryTree::FunctionName(){}。

构造函数的作用就是给类中数据赋初值嘛,所以不用返回值。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于C++中在类中使用结构体定义的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)