Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
#1

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

12.08.2015, 00:12. Просмотров 260. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание объекта в const методе (C++):

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

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

Передача строки в методе COM объекта - C++
Имеется HRESULT q(BSTR *q1); STDMETHODIMP CSomeClass::q(BSTR q1) { *q1 = (BSTR)'Some string'; return S_OK; }Все...

Изменение ссылки const объекта - C++
Добрый вечер, #include <iostream> using namespace std; class Foo { private: int a; int& b;

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

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

8
castaway
Эксперт С++
4919 / 3027 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
12.08.2015, 01:04 #2
Цитата Сообщение от [progeR] Посмотреть сообщение
Если убрать const, то все ок. А если не убирать?
А если не убирать, то можно добавить в 3-ю строку, как написано в сообщении об ошибке.
0
hoggy
6763 / 2948 / 507
Регистрация: 15.11.2014
Сообщений: 6,624
Завершенные тесты: 1
12.08.2015, 06:34 #3
Цитата Сообщение от [progeR] Посмотреть сообщение
new QPrintDialog(this);
поскольку функция-член помечена, как const,
то this - это не QWidget*, а const QWidget*
в то время, как конструктор QPrintDialog ожидает QWidget*
2
[progeR]
30 / 8 / 0
Регистрация: 20.08.2011
Сообщений: 610
Завершенные тесты: 1
12.08.2015, 08:06  [ТС] #4
Короче, как писать?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
6763 / 2948 / 507
Регистрация: 15.11.2014
Сообщений: 6,624
Завершенные тесты: 1
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
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.08.2015, 08:34 #8
Цитата Сообщение от Ilot Посмотреть сообщение
Не привязывать dialog к данному виджету как к родительскому.
В таком случае, удобнее создать его на стеке. А то ещё delete придется не забыть.
К тому же с диалогами может быть всё же актуально задавать родителя, например для обеспечения модального отображения (не уверен, доку смотреть лень).
0
Ilot
Модератор
Эксперт С++
1825 / 1183 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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 - C++
#include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;iostream.h&gt; #include&lt;windows.h&gt; #include&lt;cstring.h&gt; // это просто для русских...

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

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения - C++
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} return c; } Функция...


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

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

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