CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум C++ > Форум C++ Builder

Ответ Создать новую тему
 
Старый 30.01.2012, 21:23   #1
Байт
Форумчанин
 
Аватар для Байт
 
Регистрация: 24.12.2010
Адрес: Москва
Сообщений: 2,241
Репутация: 2030 (1589)
По умолчанию Может ли конструктор формы возвращать NULL

Это нужно вот зачем.
Создаю форму, которая должна работать с файлом. А файла нет. Существование форму бессмысленно.
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
 
TForm2::Tform2(... char *Name)
{ FILE *f = fopen(Name, "r");
  if (f==NULL) {
     ShowMessage("Нет файла");
     delete this;  //  ???
     this = NULL; // ????
     return NULL;  //   ????
  }
....
}
 
Использование
Код C++
1
2
3
4
5
 
  TForm2 *F2 = new TForm2(..."file.txt");
  if (F2==NULL) return;
  else F2->Show();
 
Смущает то, что конструктор как бы ничего не должен возвращать...
Можно, конечно, использовать extern флаг. Но это некрасиво как-то
Байт вне форума
Другие темы раздела
C++ Builder Проверка наличия CD привода
В "SYSTEM\\CurrentControlSet\\Services\\Cdrom\\Enum" храниться информация только о том, какие CD приводы подключались к компьютеру. Функция mciSendString("capability cdaudio can play wait", NULL, 0, F->Handle) всё время выдаёт один и тот же результат, вне зависимости от того, подключён ли CD-ROM..... Проверка наличия CD привода
Создание приложений для контроллеров Siemens C++ Builder
Подскажите пожалуйста, книги/примеры/ссылки, где хорошо описывается разработка прикладных приложений для контроллеров Siemens. Заранее, благодарен. Создание приложений для контроллеров Siemens
Старый 30.01.2012, 21:36   #2
Samrisbe
Студент
 
Аватар для Samrisbe
 
Регистрация: 28.01.2011
Адрес: Россия
Сообщений: 1,317
Репутация: 893 (506)
По умолчанию Re: Может ли конструктор формы возвращать NULL

А проверку невариант сделать на наличие файла?
Код C++
1
if (FileExists)
Samrisbe вне форума
Старый 30.01.2012, 21:55  [ТС]   #3
Байт
Форумчанин
 
Аватар для Байт
 
Регистрация: 24.12.2010
Адрес: Москва
Сообщений: 2,241
Репутация: 2030 (1589)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Цитата Сообщение от Samrisbe Посмотреть сообщение
А проверку невариант сделать на наличие файла?
Код C++
1
if (FileExists)
Эта форма вызывается во многих местах, происходит работа с файлами разных типов и из разных точек, по разным кнопочкам.
Конечно, можно каждый раз проверять, а есть ли файл, но мне казалось, что логичнее всего это переложить на конструктор Формы2
Выход есть, и достаточно экономный, завести внеклассовую функцию, которая проверит наличие файла
и активизирует Форму2. Или через extern-флаг. Но некрасиво как-то. И хотелось бы знать, есть ли какой-то способ сказать, что конструирование формы (или другого компонента) закончилось неудачно.
Байт вне форума
Старый 30.01.2012, 21:57   #4
DefineTrueFalse
Форумчанин
 
Регистрация: 25.10.2011
Сообщений: 743
Репутация: 726 (334)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Я вопрос не совсем понял, в итоге реализации что должно быть?
DefineTrueFalse вне форума
Старый 30.01.2012, 22:09  [ТС]   #5
Байт
Форумчанин
 
Аватар для Байт
 
Регистрация: 24.12.2010
Адрес: Москва
Сообщений: 2,241
Репутация: 2030 (1589)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Потому что, если нет, то это довольно увесистый камень в огород ООП вообще и Страуструпа в частности.

Добавлено через 10 минут
Можно, конечно, сделать через исключения, но это тоже как-то топорно.
Байт вне форума
Старый 30.01.2012, 22:11   #6
DefineTrueFalse
Форумчанин
 
Регистрация: 25.10.2011
Сообщений: 743
Репутация: 726 (334)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Аааа все догнал)), а то я уже в пачноуты полез искать на тему создание формы из файла в раде )))) Конструкторы и деструкторы на то и рассчитаны, что они в принципе значений не возвращают. Создайте метод в классе через "класс эскплоер" и вы увидите, что он сразу блокирует поле ввода возвращаемого значения.
Цитата Сообщение от Байт Посмотреть сообщение
delete this;
Вот это в конструкторе прописывать крайне не советую. В лучшем случае эффекта не будет. Если хотите автоматизировать процесс в этом ключе, то просто напишите отдельную функцию с результирующим булевым значением и используйте ее после стандартной инициализации. И там уже можете использовать delete (хотя с формой тоже надо обдумать, все-таки визуальный класс). Но обязательно припашите return true/false, чтобы исключить дальнешие обращения к форме.
DefineTrueFalse вне форума
Старый 30.01.2012, 22:37  [ТС]   #7
Байт
Форумчанин
 
Аватар для Байт
 
Регистрация: 24.12.2010
Адрес: Москва
Сообщений: 2,241
Репутация: 2030 (1589)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
Вот это в конструкторе прописывать крайне не советую. В лучшем случае эффекта не будет.
Ну я не зря поставил там кучу вопросительных. Понимаю, что все это глупости. Просто - что в голову приходило.
Ладно, останавливаемся на extern-флаге. "...Оно надежней, да к тому и тише..."
Байт вне форума
Старый 30.01.2012, 22:49   #8
DefineTrueFalse
Форумчанин
 
Регистрация: 25.10.2011
Сообщений: 743
Репутация: 726 (334)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Цитата Сообщение от Байт Посмотреть сообщение
Ладно, останавливаемся на extern-флаге. "...Оно надежней, да к тому и тише..."
А можно узнать, чем вам глобальные переменные помогут? Что-то вроде, если не получилось создать - записать в глобальную переменную "ПОЖАР"?
DefineTrueFalse вне форума
Старый 30.01.2012, 22:59   #9
IGPIGP
Форумчанин
 
Регистрация: 04.12.2011
Адрес: Одесса
Сообщений: 791
Репутация: 765 (358)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Цитата Сообщение от Байт Посмотреть сообщение
Смущает то, что конструктор как бы ничего не должен возвращать...
Можно, конечно, использовать extern флаг. Но это некрасиво как-то
Простите, может не понимаю, а разве конструктор класса, кроме выделения памяти под объект не возвращает указатель на него (всегда)? Другое дело что указатель на Ничто (Null) может вернуться по разным причинам, т.е. неудачная инициализация других полей или аж неудача с выделением памяти, и если нужно знать точно то тада что-то надо сделать
IGPIGP на форуме
После регистрации реклама в сообщениях будет скрыта
Старый 30.01.2012, 23:29  [ТС]   #10
Байт
Форумчанин
 
Аватар для Байт
 
Регистрация: 24.12.2010
Адрес: Москва
Сообщений: 2,241
Репутация: 2030 (1589)
По умолчанию Re: Может ли конструктор формы возвращать NULL

Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
А можно узнать, чем вам глобальные переменные помогут? Что-то вроде, если не получилось создать - записать в глобальную переменную "ПОЖАР"?
Именно так. И уже получилось.
Код C++
1
2
3
4
5
 
TForm2 *F = new TForm2(this, fname);
if (Fare) { delete F; return; }
else F->Show();
 


Добавлено через 7 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Простите, может не понимаю, а разве конструктор класса, кроме выделения памяти под объект не возвращает указатель на него (всегда)? Другое дело что указатель на Ничто (Null) может вернуться по разным причинам, т.е. неудачная инициализация других полей или аж неудача с выделением памяти, и если нужно знать точно то тада что-то надо сделать
Выделяет и возвращает. Но я не могу заставить его вернуть ничего другого, что говорило бы о неудачном конструировании. Только если он сам этого пожелает, скажем, когда памяти не хватает. Но это, кажется тоже не так, просто программа затыкается в точке выделения памяти и все. Ну, исключение выбрасывает.
Но я кажется нашел оптимальное решение.
Просто поле-флаг в самой TForm2, вот его-то и проверять.
Байт вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
С++ для начинающих неправильно работает конструктор копирования list, кто-нибудь может объяснить почему?
#include <windows.h> #include <stdio.h> #include <list> #include <iterator> #include <iostream> using namespace std; list <int> f () { list <int> lisc;
kravam
Turbo Pascal Может ли функция возвращать два значения?
Есть некоторая функция F. У неё входные параметры - t, x. Выходные: xp, xp, где xp:=t*x; xp:=t+x; В дальнейшем xp и xp будут используются в головной программе. Как сделать, чтобы функция вернула и значение xp, и значение xp? Не хочу разбивать функцию на две.
Dimon 128500
Visual C++ Почему CreateWindow может возвращать NULL?
Решил разобраться как устроено управление окнами на уровне API. Посмотрел стартовый пример из Visual Studio, разобрался в процессе создания. Потом создал совсем пустой проэкт, и написал аналогичную програмку, которая только создает окно и обрабатывает кое-какие сообщения. Все ключи компилятора...
Alkersan
MySQL Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на примере показать для чего она нужна. Спасибо!!
server2010
С++ для начинающих При каких условиях функция SQLGetInfo может возвращать пустое имя?
При каких условиях функция SQLGetInfo может возвращать пустое имя SQL-сервера, при этом статус завершения SQL_SUCCESS, соединение с сервером установлено успешно и SQL-сервер установлен на удаленной машине.
johnr
Опции темы

Текущее время: 00:35. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика