C ++: значения по умолчанию в классе - PullRequest
5 голосов
/ 21 марта 2012

У меня проблема с указанием значений по умолчанию для моих членов класса C ++.Мой код:

От Someclass.h:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool);
}

... от SomeClass.cpp:

void SomeClass::printOut(bool foobar=true)
{
    if (foobar) { std::cout << foobar << std::endl; }
}

... и, наконец, из main.cpp:

int main()
{
    SomeClass s;
    s.printOut();
    return 0;
}

Это, однако, дает сообщение об ошибке (gcc):

../main.cpp: In function `int main()':
../main.cpp:8: error: no matching function for call to `SomeClass::printOut()'
../SomeClass.h:18: note: candidates are: void SomeClass::printOut(bool)
subdir.mk:21: recipe for target `main.o' failed
make: *** [main.o] Error 1

Я пыталсяуказав значение по умолчанию непосредственно в объявлении класса в заголовочном файле и т. д. Я также попытался выполнить поиск в Stack Overflow и в Google в целом, но нигде не смог найти никакого решения.Что я делаю не так?

Ответы [ 7 ]

7 голосов
/ 21 марта 2012

Вы не указали значение по умолчанию для параметра в заголовке как таковое, компилятор ищет функцию подписи void printOut(void) для вашего утверждения s.printOut();, но правильно не находит ее. Что вам нужно это:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut( bool fValue = true );  // Note change in param in definition
}

А в вашем cpp:

void SomeClass::printOut(bool foobar /*=true*/ )
{
    if (foobar) { std::cout << foobar << std::endl; }
}

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

4 голосов
/ 21 марта 2012

Вам необходимо объявить значение по умолчанию внутри определения класса, а не в реализации.

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool foobar = true);   //move default here
}

void SomeClass::printOut(bool foobar)     //remove from here
{
    if (foobar) { std::cout << foobar << std::endl; }
}

Также обратите внимание, что:

SomeClass s();

не делает то, что вы ожидаете. Он не создает объект s типа SomeClass, но объявляет функцию s с типом возврата SomeClass. s.printOut(); не должен компилироваться.

Вы, вероятно, хотите:

SomeClass s;
1 голос
/ 21 марта 2012

Попробуйте указать значение по умолчанию в заголовочном файле:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool foobar=true);
}
1 голос
/ 21 марта 2012

переписать следующим образом .. note bool b = false

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool b=false);
}
1 голос
/ 21 марта 2012

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

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool value = true);
}
1 голос
/ 21 марта 2012

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

0 голосов
/ 21 марта 2012

значение по умолчанию должно быть указано в объявлении, а не в определении. Вы можете указать значение по умолчанию в обоих местах, но не можете пропустить из определения. Надеюсь, я не запутаю тебя. Я покажу исправленный код, чтобы вы могли понять:

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
    void printOut (bool foobar = true);
}

... от SomeClass.cpp:

void SomeClass::printOut() //or you can use: void SomeClass::printOut(bool foobar=true)
{
    if (foobar) { std::cout << foobar << std::endl; }
}

... и, наконец, из main.cpp:

int main()
{
    SomeClass s();
    s.printOut();
    return 0;
}
...