Russian Qt Forum
Ноябрь 22, 2024, 23:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать, что class инициализирован  (Прочитано 7053 раз)
alik
Гость
« : Февраль 18, 2015, 12:36 »

Добрый день,

Я новичок в С++ и не могу разобраться как проверять инициализирован класс или нет.
В Delphi это делается просто:

if SomeClass <> nil then
  Flag_Initialized := False;
else
  Flag_Initialized := True;

А как такое сделать в QT ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 18, 2015, 12:39 »

Класс не может быть инициализирован, может быть создан экземпляр класса. Сформулируй свой вопрос по-другому. И почитай книжки по плюсам.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alik
Гость
« Ответ #2 : Февраль 18, 2015, 13:32 »

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

А переменная типа-класс является сама по себе адресом (как в Дельфи) или нет ?
Записан
Bepec
Гость
« Ответ #3 : Февраль 18, 2015, 13:43 »

Почитайте про указатели.

PS слишком много надо объяснять Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Февраль 18, 2015, 15:07 »

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

А переменная типа-класс является сама по себе адресом (как в Дельфи) или нет ?

в ++ нельзя создать переменную такого типа
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Figaro
Гость
« Ответ #5 : Февраль 23, 2015, 10:40 »

В дельфях объект класса создается так:

Код:
SomeClass := TSomeClass.Create(nil);
if SomeClass <> nil then
  Flag_Initialized := False;
else
  Flag_Initialized := True;

nil в вызове конструктора, замените на свою "порнографию"...

Тож самое на плюсах без использования смартпойнтеров:

Код:
SomeClass = new TSomeClass();
if (SomeClass != NULL)
  Flag_Initialized = False;
else
  Flag_Initialized = True;

P.S. Пример на плюсах в Вашей нотации...
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Февраль 23, 2015, 11:39 »

Код
C++ (Qt)
SomeClass = new TSomeClass();
if SomeClass <> nil then
Это в C++ работать не будет. Конструктор не вернет NULL, внутри  него сгенерится исключение и эти проверки на NULL бессмысленны. Теоретически, можно перегрузить оператор new для TSomeClass, но оно вам надо?
Код
C++ (Qt)
 
try {
 SomeClass = new TSomeClass();
}
catch (FooError& e) {
// ...code that handles "foo" errors...
}
Кстати, и в Delphi правильное создание объекта выглядит не так, как в первом посте, а примерно вот так:
Код
Delphi
SomeClass := TSomeClass.Create(nil);
try
 SomeClass.DoIt();
finally
 FreeAndNil(SomeClass);
end;
 
« Последнее редактирование: Февраль 23, 2015, 11:49 от xokc » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Февраль 23, 2015, 11:52 »

Figaro, просто скажите, что хотите сделать Улыбающийся
Записан

vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #8 : Февраль 23, 2015, 17:04 »

погадаем на гуще:

1. если есть переменная-поинтер на объект какого-то класса и надо знать присвоено ли ей значение адреса какого-то объекта, то: инициализируем переменную в nullptr (не в 0, не в NULL), присваем, юзаем. Если надо очистить, то присваиваем nullprt опять.

2. если надо знать создался ли и инициализировался в конструкторе объект класса, то юзаем exceptions. Т.к. конструктор не может вернуть true или false

3. если без исключений, то разносим создание объекта и его инициализацию: конструктор создает объект, а отдельный метод класса bool init() инициализирует объект. Т.о. вызовом еще одного метода класса bool isInitialized() можно узнать инициализирован ли объект
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 22.