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

时间:2022-08-30 19:09:06
刚接触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...

4 个解决方案

#1


首先楼主,MakeNode不是构造函数,你可以查看一下教材中构造函数的定义,构造函数必须和类名一样,且没有返回值。

第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点类似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。

一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外

声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,如果类的所有函数和变量都是private,那就没有任何意义了

#2


嗯  谢谢了!不过第一点没太明白,构造函数没有返回值?是因为函数和构造函数是2个不同的概念吗?

#3


另外,

class BinaryTree{
    private:
        typedef struct Item{
        ........
        }Item;
    public:
        Item  FuncitonName(para....);
}

我该怎么在外部定义Item FuncitonName(para....)呢?

#4


引用 3 楼 xiongshaoliu的回复:
另外,

class BinaryTree{
    private:
        typedef struct Item{
        ........
        }Item;
    public:
        Item  FuncitonName(para....);
}

我该怎么在外部定义Item FuncitonName(para....)呢?

类外定义加上作用域操作符“::”即可:BinaryTree::Item BinaryTree::FunctionName(){}。
构造函数的作用就是给类中数据赋初值嘛,所以不用返回值。

#1


首先楼主,MakeNode不是构造函数,你可以查看一下教材中构造函数的定义,构造函数必须和类名一样,且没有返回值。

第二,内联函数和普通函数的区别不在于其访问权限,而在于其调用方式,内联函数在编译时,会将函数体代码直接拷贝到调用处,有点类似于宏的用法,所以在运行时,不需要像一般函数调用那样,对现场进行压栈操作等,实现效率高,但会增加代码的扩充,即增加可执行文件的大小。

一般来说,需要被外界访问的就用public,不需要外部访问的就用private,需要继承访问的就用protect。所以一般来说,构造函数是public,除单例模式以外

声明public并不会破坏封装性,封装性指的是数据,而不是方法,public就好像是一个对外的接口,如果类的所有函数和变量都是private,那就没有任何意义了

#2


嗯  谢谢了!不过第一点没太明白,构造函数没有返回值?是因为函数和构造函数是2个不同的概念吗?

#3


另外,

class BinaryTree{
    private:
        typedef struct Item{
        ........
        }Item;
    public:
        Item  FuncitonName(para....);
}

我该怎么在外部定义Item FuncitonName(para....)呢?

#4


引用 3 楼 xiongshaoliu的回复:
另外,

class BinaryTree{
    private:
        typedef struct Item{
        ........
        }Item;
    public:
        Item  FuncitonName(para....);
}

我该怎么在外部定义Item FuncitonName(para....)呢?

类外定义加上作用域操作符“::”即可:BinaryTree::Item BinaryTree::FunctionName(){}。
构造函数的作用就是给类中数据赋初值嘛,所以不用返回值。