Создание закрытого типа структуры дает мне ошибку «конструктор по умолчанию ... на него нельзя ссылаться - это удаленная функция». - PullRequest
0 голосов
/ 17 декабря 2018

Мне разрешено создавать и добавлять собственные данные только в качестве закрытого типа.Пожалуйста, рассмотрите следующий код.Моя ошибка возникает в "newNode = new Node;":

#ifndef COACHINGSTAFF_H
#define COACHINGSTAFF_H

#include <string>

typedef std::string IType;

class CoachingStaff
{
public:
    CoachingStaff(); // Create an empty CoachingStaff list

private:
    struct Node
    {
        std::string firstName;
        std::string lastName;
        IType& value;

        Node *next;
        Node *prev;
    };

    Node *head;
    Node *tail;

    Node* ptrToNested()
    {
        Node *newNode;
        newNode = new Node;
        return newNode;
    }
};

#endif // !

В строке "newNode = new Node" я получаю сообщение об ошибке:

"конструктор по умолчанию для" CoachingStaff:На узел «нельзя ссылаться - это удаленная функция.»

Кажется, я получаю эту ошибку, если пытаюсь выделить память для нового объекта Node где-нибудь в моем коде.Может кто-нибудь помочь мне с этим вопросом?

1 Ответ

0 голосов
/ 17 декабря 2018

Давайте посмотрим на ваш Node класс.

struct Node
{
    std::string firstName;
    std::string lastName;
    IType& value;

    Node *next;
    Node *prev;
};

Класс узла хранит ссылку на IType.Можно хранить ссылки в структурах и классах, но ссылки имеют , которые должны быть назначены при построении структуры.Давайте посмотрим, как выглядит конструктор для Node:

struct Node
{
    std::string firstName;
    std::string lastName;
    IType& value;

    Node *next;
    Node *prev;
    Node(std::string const& fName, std::string const& lName, IType& val)
      : firstName(fName) //Constructs firstName
      , lastName(lName)  //Constructs lastName
      , value(val)       //Assigns the reference
    { } //The body of the constructor doesn't have to do anything
};

В этом случае value ссылается на вход val.Для Node нет конструктора по умолчанию, потому что это оставит значение неназначенным, а ссылку всегда нужно будет присвоить чему-либо.Вот почему компилятор говорит, что он удален.

Определенно есть случаи, когда вы хотите, чтобы класс сохранял ссылку.Я использовал это несколько раз в своем коде, часто при определении классов, которые должны функционировать как замыкание.Это действительно полезно для написания обратных вызовов.Однако в вашем конкретном случае хранение IType напрямую является, вероятно, лучшим вариантом:

struct Node
{
    std::string firstName;
    std::string lastName;
    //value is stored directly, 
    //so Node is default-constructible
    IType value; 

    Node *next;
    Node *prev;
};
...