据我所知,c ++中的结构和类之间的差异很小(两个?)。尽管如此,我已经被指示使用结构来定义简单的小东西,例如可能不需要成员函数的节点(尽管事实上我可以在技术上包括include成员函数)。例如,我可以将节点定义为链表类的私有成员,如下所示:
class LinkedList {
struct Node {
MyObject *data;
Node *next;
};
Node *list;
};
但是,在这种情况下,是否可以在堆上创建此结构的新实例,还是需要定义构造函数?有没有办法在没有new运算符的情况下在堆上创建东西?或者,更好的是:我是否没有必要紧紧抓住我不应该为结构定义成员函数的概念?我应该继续定义一个吗?或者如果我这样做,是否会承认Node真的应该是一个内部类,而不是内部结构?我真的应该担心这些事吗?哪个更具可读性?
谢谢!
答案 0 :(得分:5)
但是,在这种情况下,是否可以在堆上创建此结构的新实例,还是需要定义构造函数?有没有办法在没有new运算符的情况下在堆上创建东西?
如前所述,您可以通过new或malloc在堆上创建新实例。
或者,更好的是:我是否没有必要紧紧抓住我不应该为结构定义成员函数的概念?
这是一个更有趣的问题。 c ++中struct
和class
之间的主要(仅?)差异是
默认访问说明符。也就是说,struct
默认为公共访问,class
默认为私有。在我看来,这是差异,应该决定你使用哪两个。基本上,如果用户应该直接访问成员,那么它应该是struct
。
例如,如果您没有成员函数,那么显然目的是直接访问对象的成员,因此它将是struct
。如果一个对象只是一个小的私有帮助器来实现它的外部类,就像在你的例子中那样,那么即使它有成员函数,它通常也是最容易允许外部类访问的对其成员而言应该是struct
。通常使用这些类,外部类的实现与内部类的实现紧密耦合,因此没有理由将它们隐藏在另一个类中。
因此,对于琐碎的(例如std :: pair)对象或那些使用受限的对象(如在私有内部类中),对成员的默认访问可能是一件好事,在这些情况下我会使它们{{1 }}
答案 1 :(得分:4)
Malloc工作正常:
Node *n = (Node*)malloc(sizeof(*n));
请记住free()
任何malloc()
'和delete
任何new
'd。
答案 2 :(得分:2)
即使您没有定义构造函数,编译器也会创建一个默认构造函数,因此您可以使用运算符'new':
Node *n = new Node;
AFAIAC,结构是一个类,除了它的“公共性”默认是相反的。
答案 3 :(得分:2)
但是,在这种情况下,是否可以在该结构上创建此结构的新实例 堆,还是需要定义构造函数?
是的,您可以在堆上创建它而无需定义构造函数。
有没有办法在没有new运算符的情况下在堆上创建东西?
你可以使用'malloc',在释放内存时使用'free'。否则别无他法。
或者,更好的是:我是否没有必要紧紧抓住我的观念 不应该为结构定义成员函数?
就个人而言,如果我需要我的struct具有成员函数,我将其更改为一个类。我倾向于使用结构,因为可能会在OCaml中使用记录。
答案 4 :(得分:1)
我真的应该担心这些事情吗?
是。正如你所说,结构和类之间确实没有重要的区别。如果您被告知要创建struct
,并且它至少需要一个成员函数,那么定义成员函数。
这真的没什么大不了的。
但除此之外,你当然可以在没有构造函数的情况下堆分配结构(否则malloc
在C语言中会毫无意义。该语言甚至都没有构造函数)
鉴于struct S
,您只需拨打new S
或new S()
,具体取决于您想要的初始化类型。如果你没有定义构造函数,编译器会为你创建一个。