Russian Qt Forum

Программирование => С/C++ => Тема начата: alik от Февраль 18, 2015, 12:36



Название: Как узнать, что class инициализирован
Отправлено: alik от Февраль 18, 2015, 12:36
Добрый день,

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

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

А как такое сделать в QT ?


Название: Re: Как узнать, что class инициализирован
Отправлено: Пантер от Февраль 18, 2015, 12:39
Класс не может быть инициализирован, может быть создан экземпляр класса. Сформулируй свой вопрос по-другому. И почитай книжки по плюсам.


Название: Re: Как узнать, что class инициализирован
Отправлено: alik от Февраль 18, 2015, 13:32
Класс не может быть инициализирован, может быть создан экземпляр класса. Сформулируй свой вопрос по-другому. И почитай книжки по плюсам.

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


Название: Re: Как узнать, что class инициализирован
Отправлено: Bepec от Февраль 18, 2015, 13:43
Почитайте про указатели.

PS слишком много надо объяснять :)


Название: Re: Как узнать, что class инициализирован
Отправлено: kambala от Февраль 18, 2015, 15:07
Класс не может быть инициализирован, может быть создан экземпляр класса. Сформулируй свой вопрос по-другому. И почитай книжки по плюсам.

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

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


Название: Re: Как узнать, что class инициализирован
Отправлено: Figaro от Февраль 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. Пример на плюсах в Вашей нотации...


Название: Re: Как узнать, что class инициализирован
Отправлено: xokc от Февраль 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;
 


Название: Re: Как узнать, что class инициализирован
Отправлено: gil9red от Февраль 23, 2015, 11:52
Figaro, просто скажите, что хотите сделать :)


Название: Re: Как узнать, что class инициализирован
Отправлено: vipet от Февраль 23, 2015, 17:04
погадаем на гуще:

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

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

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