Не нашел, что-то ответа на такой простой ответ. До этого не делал в конструкторе перегрузки таким образом (см. код ниже). В функциях/методах таким образом проходит нормально все. Вообще-то и тут все вроде нормально (на первый взгляд ;)). Компилируется без ошибок (только незаметный варнинг выходит - о нем тоже ниже). Т.е. эта информация будет полезна тем кто так сделает и даже у кого с первого раз все заработает нормально. А на самом деле так неправильно получается:
Camera::Camera(int width, int height)
{
Camera(width, height, CAMERA_ENCODING::MJPEG);
}
Camera::Camera(int width, int height, CAMERA_ENCODING encoding)
{
... // какой-то код
}
А как тогда правильно делать? Неужели в верхнем конструкторе переписывать также весь код инициализации полностью надо? И еще про варнинг тут - пишет, что в верхнем конструкторе уже поле не проинициализировано. Конкретно - это ссылка на буфера. В нижнем на нее нет ест-но варнинга т.к. она тут нормально инициализируется в его коде. И в верхнем по идее должна, но оказывается это не так. Спасибо и извините если много понаписал тут.
Если вы пытались делегировать вызов из одного конструктор в другой, то это делается так
Camera::Camera(int width, int height) : Camera(width, height, CAMERA_ENCODING::MJPEG)
{
...
}
Однако подобное делегирование - это свойство С++11 и выше.
До С++11 синтаксиса для делегирования вызовов конструкторов в С++ не было, и если возникала необходимость устранить повторяемость кода, то общий код по возможности приходилось выносить в обыкновенную функцию (с потерей конструкторских особенностей).
В вашем же варианте имеет место создание (и немедленное уничтожение) независимого временного объекта, не имеющего никакого отношения к конструируемому объекту.
В связи с отсутствием места для нормального кода в комментариях...
В данном конкретном случае не имеет смысла городить огород, достаточно создать конструктор с третьим параметром по умолчанию:
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
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники