Что если значение параметра по умолчанию определено в коде, который не виден на сайте вызова? - PullRequest
8 голосов
/ 17 июля 2009

Я нашел какой-то странный код ...

//in file ClassA.h:
class ClassA {
public:
    void Enable( bool enable );
};

//in file ClassA.cpp
#include <ClassA.h>
void ClassA::Enable( bool enable = true )
{
   //implementation is irrelevant
}

//in Consumer.cpp
#include <ClassA.h>
....
ClassA classA;
classA.Enable( true );

Очевидно, поскольку Consumer.cpp включает только ClassA.h, а не ClassA.cpp, компилятор не сможет увидеть, что параметр имеет значение по умолчанию.

Когда какое-либо влияние окажет объявленное значение по умолчанию ClassA::Enable в сигнатуре реализации метода? Это произойдет, только если метод вызывается из файлов, которые включают ClassA.cpp?

Ответы [ 4 ]

11 голосов
/ 17 июля 2009

Значения по умолчанию - это просто время компиляции. В скомпилированном коде нет значения по умолчанию (нет метаданных или тому подобного). По сути, это замена компилятора для «если вы ничего не напишите, я вам это уточню». Таким образом, если компилятор не может видеть значение по умолчанию, предполагает, что нет ни одного .

Демо-версия:

// test.h
class Test { public: int testing(int input); };

// main.cpp
#include <iostream>
// removing the default value here will cause an error in the call in `main`:
class Test { public: int testing(int input = 42); };
int f();
int main() {
   Test t;
   std::cout << t.testing()  // 42
             << " " << f()   // 1000
             << std::endl;
   return 0;
}

// test.cpp
#include "test.h"
int Test::testing(int input = 1000) { return input; }
int f() { Test t; return t.testing(); }

Тест:

g++ main.cpp test.cpp
./a.out
3 голосов
/ 17 июля 2009

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

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

1 голос
/ 17 июля 2009

Это произойдет только тогда, когда метод вызывается из файлов, которые включить ClassA.cpp?

Это верно. Но учтите, что это почти наверняка приведет к множественным ошибкам определения, поэтому значение по умолчанию действительно доступно только с точки определения в ClassA.cpp.

0 голосов
/ 17 июля 2009

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

class ClassA {
public:
    void Enable( bool enable = true );
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...