Ошибка конструктора C ++ по умолчанию - PullRequest
2 голосов
/ 26 марта 2011

Мне нужна помощь в отношении строительства класса. В моем классе я использовал конструктор копирования и оператор =, чтобы предотвратить их создание компилятором. В моей основной программе, когда я пытаюсь создать экземпляр класса, я получаю сообщение об ошибке «Нет конструктора по умолчанию для класса».

В чем может быть проблема?

Это фрагмент моего кода.

class netlist {
    netlist(const netlist &);
    netlist &operator=(const netlist &);
    std::map<std::string, net *> nets_;
}; // class netlist

В своей основной функции я использую:

netlist nl;

Здесь я получаю сообщение об ошибке. Я предоставляю объявление конструктора копирования, поэтому они не должны быть проблемой.

Буду признателен за любую помощь в этом. Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 26 марта 2011

Есть две проблемы с кодом -

  1. члены класса по умолчанию private .
  2. "I get an error saying "No default constructor exists for the class" ".

Поскольку, если какой-либо конструктор предоставляется как часть объявления класса (netlist класс имеет конструктор копирования в этом случае), конструктор по умолчанию (т. Е. Конструктор без аргументов) не предоставляется компилятором.

netlist nl;  // And this invokes call to the default constructor and so
             // the error

netlist.h

class netlist {

public: // Added
    netlist(); // This just a declaration. Should provide the definition.
    netlist(const netlist &);
    netlist &operator=(const netlist &);
    std::map<std::string, net *> nets_;
}; // class netlist

netlist.cpp

netlist::netlist()
{
       // .....
}

// Other definitions
6 голосов
/ 26 марта 2011

Когда вы создаете список соединений, вы не передаете конструктору никаких аргументов, что означает, что вы вызываете конструктор по умолчанию. Однако вы не определили конструктор по умолчанию. Вы только создали конструктор, принимающий другой список соединений в качестве параметра (конструктор копирования) здесь:

netlist(const netlist &);

Вы должны определить конструктор по умолчанию следующим образом:

netlist();

Обратите внимание, что если бы вы не определили какой-либо конструктор, компилятор добавил бы по умолчанию, но поскольку вы добавили конструктор копирования, вы должны определить их все сами.

0 голосов
/ 26 марта 2011

раздел [class.ctor] стандарта гласит (формулировка из черновика n3242):

A конструктор по умолчанию для класса X - это конструктор класса X, который можно вызывать без аргумента. Если для класса X не объявлен пользовательский конструктор, конструктор без параметров неявно объявляется как дефолтный (8.4). Неявно объявленный конструктор по умолчанию является inline public членом своего класса.

У вас есть объявленный пользователем конструктор:

netlist(const netlist &);

Таким образом, компилятор не предоставляет конструктор по умолчанию.

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