изменяю, дополняя параметром?
было:
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = nullptr);
}
хочу сделать
#include <Section.h>
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(ui::Section *section = nullptr, QWidget *parent = nullptr);
}
но получаю тонну ошибок при сборке
мб стоит поставить секцию необязательным параметром после родителя, т.к. код, возможно, попытается вызвать именно родной для виджета конструктор с 1 параметром алсо, не забывайте про : QWidget(parent) или :Form(parent), если это именно дефолтная анриалская форма
Вы ерунду говорите. Список инициализации он сам пишет и не имеет никакого значения в каком порядке параметры, кроме одного - параметры с дефолтами должны быть в конце
Разве дефолтные параметры позволяют игнорировать порядок параметров? class Foo : public Bar{ public: explicit Foo(a A=null, b B= null) : Bar(B); } позволяет вызвать Foo(), Foo(A) и Foo(A,B), но не Foo(B) И если в коде где-то будет вызываться Foo(B), что вполне вероятно для класса-наследника Bar, с конструктором Bar(b B), перегрузка не разрешится и код не скомпилится Поясните, пожалуйста, где я ошибаюсь
Как все что вы написали относится к вашей рекомендации поменять местами параметры в объявлении? Мы ведь даже не знаем ято там за ошибка.
Просто предположение на основе выданного куска хэдера. Если смена объявления конструктора косячит - это, скорее всего, конфликт вызова этого самого конструктора где-то в коде. Будь на лапах побольше инфы, хотя бы те же "тонна ошибок" - может, дал бы другой совет.
Первой ошибки в таких случаях обычно бывает достаточно чтобы понять проблему. Покажи его
D:\qt\home\15qt\form.h:20: ошибка: 'ui' has not been declared In file included from ..\..\home\15qt\Section.h:36, from ..\..\home\15qt\Section.cpp:23: ..\..\home\15qt\form.h:20:19: error: 'ui' has not been declared explicit Form(ui::Section *section = nullptr, QWidget *parent = nullptr); ^~
Он не понимает что такой ui. Покажи, где у тебя объявлен Section
https://pastebin.com/8nuvqJrm
У тебя рекурсивный инлкуд Такое нельзя делать как минимумс #ifndef Убери #include "form.h"
так а как делать? если убираю #include "form.h" то он ругается на неизвестные типы, которые были в form.h
Что за типы? У тебя там вроде нету таких
в классе Section есть поля типа Form а в Form - Section
если один из "перекрестных инклюдов" убираю, то этот тип "not declared"
В Section нету же ни одной Form
кстати, не по теме вопроса, но обратил внимание: в чём смысл внесения ваших классов в namespace ui? Обычно так делает дизайнер и вносит в одноименный неймспейс сгенерированные из ui классы, а вы зачем-то внесли туда вручную написанный widget
ну будет. мне это и надо
я сворачиваемую вот эту секцию взял с гитхаба код, там так было, я не изменял
Тогда хз Может #pragma once тебе поможет
в таких случаях обычно делают так: в заголовке делают предварительное объявление, инклад же добавляют только в cpp, и поля объявляются указателями, что требут конечно переделки для создания удаления объектов
в вижуалке таких проблем не было...
Обсуждают сегодня