Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 614
Завершенные тесты: 1
#1

Создание объекта в const методе

12.08.2015, 00:12. Просмотров 294. Ответов 8
Метки нет (Все метки)

Есть код:
C++ (Qt)
1
2
3
4
5
void OrderPart::_printDocument(const QString &filename) const
{
    QPrintDialog *dialog = new QPrintDialog(this);
    ...
}
Вываливается сообщение: ошибка:
Код
invalid conversion from 'const QWidget*' to 'QWidget*' [-fpermissive]
     QPrintDialog *const dialog = new QPrintDialog(this);
                                                                        ^
Если убрать const, то все ок. А если не убирать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2015, 00:12
Ответы с готовыми решениями:

Создание объекта класса в методе этого же класса
собственно вопрос. можно ли создавать объект класса в методе того же класса?...

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const ...

Передача строки в методе COM объекта
Имеется HRESULT q(BSTR *q1); STDMETHODIMP CSomeClass::q(BSTR q1) { *q1...

Изменение ссылки const объекта
Добрый вечер, #include <iostream> using namespace std; class Foo {...

Как вызвать прегруженный const метод для статического объекта
class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" <<...

8
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
12.08.2015, 01:04 #2
Цитата Сообщение от [progeR] Посмотреть сообщение
Если убрать const, то все ок. А если не убирать?
А если не убирать, то можно добавить в 3-ю строку, как написано в сообщении об ошибке.
0
hoggy
Заблокирован
Эксперт С++
12.08.2015, 06:34 #3
Цитата Сообщение от [progeR] Посмотреть сообщение
new QPrintDialog(this);
поскольку функция-член помечена, как const,
то this - это не QWidget*, а const QWidget*
в то время, как конструктор QPrintDialog ожидает QWidget*
2
[progeR]
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 614
Завершенные тесты: 1
12.08.2015, 08:06  [ТС] #4
Короче, как писать?
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.08.2015, 08:28 #5

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
то this - это не QWidget*, а const QWidget*
<pedantic>
this это const QWidget* const
</pedantic>


Цитата Сообщение от [progeR] Посмотреть сообщение
Короче, как писать?
Писать надо правильно. Когда ты пишешь
C++ (Qt)
1
QPrintDialog(this);
это значит, что создаваемому диалогу задается родитель this. А так как метод _printDocument у тебя константный (т.е. члены this менять нельзя), то это не совсем корректно, ибо у родителя появляется дочерний элемент.
1
hoggy
Заблокирован
Эксперт С++
12.08.2015, 08:29 #6
Цитата Сообщение от [progeR] Посмотреть сообщение
Короче, как писать?

Не по теме:

у кого короче, тот сидит дома
(ц)Народная поговорка



C++
1
2
3
4
5
void OrderPart::_printDocument(const QString &filename) 
{
    QPrintDialog *dialog = new QPrintDialog(this);
    ...
}
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
12.08.2015, 08:30 #7
Цитата Сообщение от [progeR] Посмотреть сообщение
Короче, как писать?
Не привязывать dialog к данному виджету как к родительскому.
C++ (Qt)
1
2
3
4
5
void OrderPart::_printDocument(const QString &filename) const
{
    QPrintDialog *dialog = new QPrintDialog;
    ...
}
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.08.2015, 08:34 #8
Цитата Сообщение от Ilot Посмотреть сообщение
Не привязывать dialog к данному виджету как к родительскому.
В таком случае, удобнее создать его на стеке. А то ещё delete придется не забыть.
К тому же с диалогами может быть всё же актуально задавать родителя, например для обеспечения модального отображения (не уверен, доку смотреть лень).
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
12.08.2015, 08:39 #9
Цитата Сообщение от Tulosba Посмотреть сообщение
В таком случае, удобнее создать его на стеке.
Ваша правда.
Цитата Сообщение от Tulosba Посмотреть сообщение
К тому же с диалогами может быть всё же актуально задавать родителя, например для обеспечения модального отображения (не уверен, доку смотреть лень).
В своем проекте я создаю все диалоги на стеке и без указания родителя и таки да они по-умолчанию модальные (то же лень смотреть ассистента).
Ан нет вру:
modal : bool

This property holds whether show() should pop up the dialog as modal or modeless.

By default, this property is false and show() pops up the dialog as modeless. Setting his property to true is equivalent to setting QWidget::windowModality to Qt::ApplicationModal.

exec() ignores the value of this property and always pops up the dialog as modal.
Я всегда вызываю exec() и поэтому они у меня модальные...
0
12.08.2015, 08:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2015, 08:39

Создание объекта в функции и возврат объекта из нее
Не могу разобраться с ссылками. Возможно ли вернуть из функции объект созданный...

Нужно чтобы введённый студент в методе in вывелся на экран как в методе out
#include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;iostream.h&gt; #include&lt;windows.h&gt;...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru