Могу ли я создать новую структуру в куче без определения конструктора? - PullRequest
7 голосов
/ 13 декабря 2010

Я понимаю, что существует очень мало различий между структурами и классами в c ++ (два?). Как бы то ни было, я получил указание использовать структуры для определения простых мелочей, таких как узлы, которые могут не нуждаться в функциях-членах (несмотря на то, что я технически мог бы включать функции-члены). Например, я мог бы определить узел как закрытый член класса связанного списка следующим образом:

class LinkedList {
  struct Node {
    MyObject *data;
    Node *next;
  };

  Node *list;

};

В этом случае, однако, возможно ли создать новый экземпляр этой структуры в куче, или мне нужно определить конструктор? Есть ли способ создавать вещи в куче без нового оператора? Или, что еще лучше: не нужно ли мне так сильно цепляться за идею, что я не должен определять функции-члены для структур? Должен ли я просто пойти дальше и определить один? Или, если бы я сделал это, это было бы похоже на признание того, что Node действительно должен быть внутренним классом, а не внутренней структурой? Должен ли я действительно беспокоиться о таких вещах вообще? Что более читабельно?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 13 декабря 2010

В этом случае, однако, возможно ли создать новый экземпляр этой структуры в куче, или мне нужно определить конструктор?Есть ли способ создать вещи в куче без оператора new?

Как уже было сказано ранее, вы можете создать новый экземпляр в куче с помощью new или malloc.

Или, еще лучше: не нужно ли мне так сильно цепляться за идею, что я не должен определять функции-члены для структур?

Это более интересный вопрос.Основное (только?) Различие между struct и class в c ++ - спецификатор доступа по умолчанию.Таким образом, struct по умолчанию является общедоступным, а class - частным.На мой взгляд, это разница, которая должна определять, какой из двух вы используете.По сути, если пользователи должны иметь прямой доступ к членам, то это должен быть struct.

Если, например, у вас нет функций-членов, то, очевидно, предполагается, что члены объекта будут доступны напрямую, и это будет struct.В случае объекта, который является всего лишь небольшим помощником private для реализации своего внешнего класса, как в вашем примере, тогда даже если у него есть функции-члены, он часто более ясен, чтобы разрешить доступ внешнего класса кего члены и так должно быть struct.Зачастую с этими классами реализация внешнего класса тесно связана с реализацией внутреннего класса, и поэтому нет причин скрывать один от другого.

Таким образом, для тривиального (например, std :: pair)) объекты или объекты, использование которых ограничено (как в частном внутреннем классе), доступ по умолчанию к членам может быть хорошей вещью, и в этих случаях я бы сделал их structs.

4 голосов
/ 13 декабря 2010

Malloc отлично работает:

Node *n = (Node*)malloc(sizeof(*n));

Просто запомните free() что-нибудь malloc() 'd и delete что-нибудь new' d.

2 голосов
/ 13 декабря 2010

В этом случае, однако, возможно ли создать новый экземпляр этой структуры в куче, или мне нужно определить конструктор?

Да, вы можете создать егов куче без определения конструктора.

Есть ли способ создать вещи в куче без оператора new?

Вы можете использовать 'malloc' и при освобождениипамять использовать «бесплатно».В противном случае другого пути нет.

Или, еще лучше: мне не нужно так сильно цепляться за идею, что я не должен определять функции-члены для структур?

Лично, если мне нужна моя структура, чтобы иметь функции-члены, я превращаю ее в класс.Я склонен использовать структуры, как можно использовать запись в OCaml.

2 голосов
/ 13 декабря 2010

Даже если вы не определите конструктор, компилятор создаст конструктор по умолчанию, и поэтому вы можете использовать оператор 'new':

Node *n = new Node;

AFAIAC, структура - это класс, за исключением того, что егопо умолчанию "publicness" обратный.

1 голос
/ 13 декабря 2010

Должен ли я вообще беспокоиться о подобных вещах?

Да. Как вы говорите, действительно нет важных различий между структурами и классами. Если вам сказали сделать struct, и для него требуется хотя бы одна функция-член, тогда определите функцию-член .

Это действительно ничего страшного.

Но, кроме этого, вы, конечно, можете размещать структуры кучи без конструкторов (иначе malloc будет довольно бессмысленным в C. Этот язык даже не имеет конструкторов)

Учитывая struct S, вы можете просто позвонить new S или new S(), в зависимости от того, какой тип инициализации вы хотите. если вы не определили конструктор, компилятор сделает его для вас.

...