Файл заголовка значения по умолчанию для конструктора C ++ - PullRequest
9 голосов
/ 28 мая 2011

Я пытаюсь создать конструктор со значением по умолчанию.Сложность возникает из-за использования отдельных файлов заголовка и кода для класса.У меня есть файл заголовка, который содержит:

class foo {
    bool dbg;
    public:
        foo(bool debug = false);
}

И файл кода, содержащий:

foo::foo(bool debug = false) {
    dbg = debug;
}

Когда я пытаюсь скомпилировать с g ++ (то есть g++ -c foo.cc), он даетошибка:

foo.cc:373:65: error: default argument given for parameter 1 of ‘foo::foo(bool)’
foo.h:66:4: error: after previous specification in ‘foo::foo(bool)’

Что я делаю не так?

Ответы [ 5 ]

13 голосов
/ 28 мая 2011

По умолчанию можно перейти только в заголовочный файл. И, по моему опыту, использование значений по умолчанию в конструкторах (или других функциях) редко является хорошей идеей - оно где-то попахивает клуджем. Не скажу, что в моем собственном коде их не мало!

8 голосов
/ 28 мая 2011

Не указывайте значение по умолчанию в определении :

foo::foo(bool debug) {
    dbg = debug;
}

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

Кстати, предпочитайте использовать member-initialization-list вместо присваиваний:


И, конечно же, если это объявление-cum-Definition, то вы должны указать значение по умолчанию (если хотите) прямо в объявлении-cum-Definition:

class foo {
    bool dbg;
    public:
        foo(bool debug = false) : dbg(debug) {}
                               //^^^^^^^^^^^ using member initialization list
}
4 голосов
/ 28 мая 2011

Значение по умолчанию должно быть только в объявлении функции, когда объявление и определение разделены.


Вы можете добавить значение по умолчанию в качестве комментария, если хотите, но вы должны знать, потому что изменение значения по умолчанию и забвение изменения комментария может вызвать некоторые заблуждения (:

Например:

foo(bool debug = false);

//...

foo::foo(bool debug /* = false */ )
{ /* ... */ }
2 голосов
/ 28 мая 2011

В C ++ (я не знаю других языков) аргументы по умолчанию являются частью только объявления функции, а не определения функции.

class foo {
    bool dbg;
    public:
        foo(bool debug = false);
}

хорошо, измените свое определение на:

foo::foo(bool debug) {
    dbg = debug;
}
1 голос
/ 28 мая 2011

В определении функции-члена не требуется аргумент по умолчанию,

foo::foo(bool debug) {
    dbg = debug;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...