Перегрузки в конструкторах классов

328
13 марта 2017, 11:30

Не нашел, что-то ответа на такой простой ответ. До этого не делал в конструкторе перегрузки таким образом (см. код ниже). В функциях/методах таким образом проходит нормально все. Вообще-то и тут все вроде нормально (на первый взгляд ;)). Компилируется без ошибок (только незаметный варнинг выходит - о нем тоже ниже). Т.е. эта информация будет полезна тем кто так сделает и даже у кого с первого раз все заработает нормально. А на самом деле так неправильно получается:

Camera::Camera(int width, int height)
{
    Camera(width, height, CAMERA_ENCODING::MJPEG);
}
Camera::Camera(int width, int height, CAMERA_ENCODING encoding)
{
    ... // какой-то код
}

А как тогда правильно делать? Неужели в верхнем конструкторе переписывать также весь код инициализации полностью надо? И еще про варнинг тут - пишет, что в верхнем конструкторе уже поле не проинициализировано. Конкретно - это ссылка на буфера. В нижнем на нее нет ест-но варнинга т.к. она тут нормально инициализируется в его коде. И в верхнем по идее должна, но оказывается это не так. Спасибо и извините если много понаписал тут.

Answer 1

Если вы пытались делегировать вызов из одного конструктор в другой, то это делается так

Camera::Camera(int width, int height) : Camera(width, height, CAMERA_ENCODING::MJPEG)
{
  ...
}

Однако подобное делегирование - это свойство С++11 и выше.

До С++11 синтаксиса для делегирования вызовов конструкторов в С++ не было, и если возникала необходимость устранить повторяемость кода, то общий код по возможности приходилось выносить в обыкновенную функцию (с потерей конструкторских особенностей).

В вашем же варианте имеет место создание (и немедленное уничтожение) независимого временного объекта, не имеющего никакого отношения к конструируемому объекту.

Answer 2

В связи с отсутствием места для нормального кода в комментариях...

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

Camera::Camera(int width, int height, CAMERA_ENCODING encoding = CAMERA_ENCODING::MJPEG)
{
    ... // какой-то код
}

при этом если третий параметр будет указан, будет использовано переданное значение; если нет - значение по умолчанию:

Camera cam1(200, 300, CAMERA_ENCODING::SUPERCODE);
Camera cam2(200, 300);

Для cam1 будет вызван Camera::Camera(200, 300, CAMERA_ENCODING::SUPERCODE);, для cam2 - Camera::Camera(200, 300, CAMERA_ENCODING::MJPEG);.

Вот простейший пример -

class Test
{
public:
    Test(int w, int h, int code = -1)
    {
        cout << "w = " << w << "  h = " << h
             << "  code = " << code << endl;
    }
};

int main()
{
    Test a(2,4,8);
    Test b(3,6);
}

дает на выходе

w = 2  h = 4  code = 8
w = 3  h = 6  code = -1
READ ALSO
Ошибка sdkddkver.h

Ошибка sdkddkver.h

Использую VS2013 - затем установил VS2015 для заданий по книгеНедавно открыл через VS2013 (на VS2015 также) старые проекты для OpenGL на С++ и всё стало красным...

348
Ссылка на массив указателей. C++

Ссылка на массив указателей. C++

Есть ли какой-нибудь способ сделать ссылку на массив указателей?

423
Нужно чтобы числа рандомились с 97 до 122

Нужно чтобы числа рандомились с 97 до 122

Вылетает с ошибкой "прекращена работа программы":

280
Авторизация с помощью angular2

Авторизация с помощью angular2

Имеется простой модуль к доступу к компоненту через AuthGuard

496