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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Выход с приложения  (Прочитано 17031 раз)
blood_shadow
Гость
« : Август 11, 2010, 19:00 »

использую Qt4.6, консольное приложение есть хэдер(str.h), файл с исходным кодом(string_val.cpp) и main.cpp
string_val.cpp
Код:
#include "str.h"
#include <stdlib.h>

using std::cout;
using std::endl;

String_value::String_value(int& argc, char** argv): QCoreApplication(argc, argv),
            PathToIn(QCoreApplication::applicationDirPath() + In),
            PathToOut(QCoreApplication::applicationDirPath() + Out),
            PathToValue(QCoreApplication::applicationDirPath() + Value)
{
    extern const char en;
    int Pairs;
    QChar ch;
    qint64 end;

    //open text_file for reading
    QFile *inputFile = new QFile(PathToIn);
    inputFile->open(QIODevice::ReadOnly);
    QTextStream in(inputFile);

    //open text_file for writing
    QFile *outputFile = new QFile(PathToOut);
    outputFile->open(QIODevice::ReadWrite | QIODevice::Truncate);
    QTextStream out(outputFile);

    //open text_file for reading
    QFile *valueFile = new QFile(PathToValue);
    valueFile->open(QIODevice::ReadOnly);
    QTextStream value(inputFile);

    in >> ch;
    if (!in.status()) cout << "Opened" << endl;
    else {
        cout << "0000000" << endl;
        exit(1);
    }
    cout << "dsck" << endl;
    cout << "dsck" << endl;

}

main.cpp
Код:
#include <QtCore/QCoreApplication>
#include <string>
#include "str.h"

int main(int argc, char *argv[])
{
    String_value obj(argc, argv);
    system("PAUSE");
    return 0;
}

в хэдере класс String_value наследует QCoreApplication

1. Воспрос состоит в следующем как выйти с приложения  exit(1); - не выходит, как в обычном С++(или как вызвать стандартный exit)? ,
2. и я правильно понимаю если выйти с конструктора значит объект не будет создан и значит деструктор не вызветься?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Август 11, 2010, 19:13 »

::exit(1)
Записан
blood_shadow
Гость
« Ответ #2 : Август 11, 2010, 19:22 »

::exit(1)
Спасибо, а как организовать выход из конструктора и по этому же условию и передать управление следуещей строчке кода после попытки создания объекта в main.cpp(в даном примере system("PAUSE"))

Код:
#include <QtCore/QCoreApplication>
#include <string>
#include "str.h"

int main(int argc, char *argv[])
{
    String_value obj(argc, argv);
    system("PAUSE");
    return 0;
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Август 12, 2010, 01:38 »

>>как организовать выход из конструктора
исключение бросить в конструкторе, но его надо будет самому ловить
Записан

Юра.
SASA
Гость
« Ответ #4 : Август 12, 2010, 11:03 »

Код:
Спасибо, а как организовать выход из конструктора и по этому же условию и передать управление следуещей строчке кода после попытки создания
Этот вопрос уже обсуждался на форуме.
Я бы разделил создание объекта и инициализацию, которая может проёти успешно или нет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 12, 2010, 12:10 »

Я бы разделил создание объекта и инициализацию, которая может проёти успешно или нет.
Я бы тоже. Задача конструктора - создать полноценный объект, нечего туда сливать ф-циональность которая должна быть в методах
Записан
blood_shadow
Гость
« Ответ #6 : Август 12, 2010, 13:24 »

исключение бросить в конструкторе, но его надо будет самому ловить
организовал так как вы говорили, одна только проблема Creator выбивает exception handling disabled, use -fexceptions to enable , как бороться с таким зверем?
Записан
blood_shadow
Гость
« Ответ #7 : Август 12, 2010, 13:31 »

Я бы тоже. Задача конструктора - создать полноценный объект, нечего туда сливать ф-циональность которая должна быть в методах
но такой подход соответсвует подходу RAII, как я понимаю, получение ресурса во время инициализации, то есть в конструкторе, да и в книге которая считается самой сильной по qt (Бланшет, Саммерфилд), тоже все сливают в конструктор
Записан
BRE
Гость
« Ответ #8 : Август 12, 2010, 14:07 »

но такой подход соответсвует подходу RAII, как я понимаю, получение ресурса во время инициализации, то есть в конструкторе, да и в книге которая считается самой сильной по qt (Бланшет, Саммерфилд), тоже все сливают в конструктор
И это правильно.
После отработки конструктора, объект должен быть полностью создан, инициализирован и готов к работе без вызова других методов.

[off]
Вспомнился MFC, где после создания объекта окна, нужно было вызывать create (вроде так назывался). Было очень "удобно".
[/off]
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 12, 2010, 16:37 »

Не воспринимайте все что пишут слишком серьезно и не следуйте этому буквально  Улыбающийся  Просто мое личное мнение что скромные вещи могут быть гораздо более полезны, чем заоблачные RAI. Например

- что  класс с именем String_value оказывается ... потомок QCoreApplication - это уж точно никому в  голову не придет  Улыбающийся
Зачем давать имена не интуитивные а "наоборо"?

- если Вы хотели чтобы inputFile и outputFile удалялись автоматычно - объявите их как локальные объекты. А если они указатели - то не забудьте вызвать delete для каждого

- писать 3 раза QCoreApplication::applicationDirPath()  не есть хорошо/аккуратно, это все же вызов ф-ции

- Вы сделали всю содержательную часть в теле конструктора - это не запрещено, но не очень удобно/выгодно. Что умеет делать такой объект? Как его использовать повторно? Я так вижу что просто ф-ция (без всяких объектов) здесь более уместна. А можно и просто вставить текст в main - никакой смысловой нагрузки  String_value не несет.
Записан
blood_shadow
Гость
« Ответ #10 : Август 12, 2010, 18:03 »

Не воспринимайте все что пишут слишком серьезно и не следуйте этому буквально  Улыбающийся  Просто мое личное мнение что скромные вещи могут быть гораздо более полезны, чем заоблачные RAI. Например

- что  класс с именем String_value оказывается ... потомок QCoreApplication - это уж точно никому в  голову не придет  Улыбающийся
Зачем давать имена не интуитивные а "наоборо"?

- если Вы хотели чтобы inputFile и outputFile удалялись автоматычно - объявите их как локальные объекты. А если они указатели - то не забудьте вызвать delete для каждого

- писать 3 раза QCoreApplication::applicationDirPath()  не есть хорошо/аккуратно, это все же вызов ф-ции

- Вы сделали всю содержательную часть в теле конструктора - это не запрещено, но не очень удобно/выгодно. Что умеет делать такой объект? Как его использовать повторно? Я так вижу что просто ф-ция (без всяких объектов) здесь более уместна. А можно и просто вставить текст в main - никакой смысловой нагрузки  String_value не несет.

Спасибо, не которые вещи исправил, например:
1. убрал вообще наследование QCoreApplication(вообще непонятно зачем я его туда влепил)
2. насчет указателей я всегда освобождаю память ток делаю зачистку када прога уже готова
3. заменил 3 вызова QCoreApplication::applicationDirPath(), на один который присвоил переменной, и покидал ссылки куда надо
4. а насчет последнего, просто как-то в самом начале такое увидел и подумал раз надо в конструктора все шмалять так и буду, хотя мне это пока и не мешает, впрочем теперь у меня есть возможность самому оценивать ситуацию  Улыбающийся

Еще один вопрос остался во время использования мною исключительных ситуаций(try, cath) Creator выбил "exception handling disabled, use -fexceptions to enable" - что с этим делать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #11 : Август 12, 2010, 18:08 »

Don't use exeptions? Улыбающийся
Записан

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

Don't use exeptions? Улыбающийся
да хотелось бы использовать, в не которых местах они бы мне пригодились, только вот такая проблемка  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 12, 2010, 19:24 »

Еще один вопрос остался во время использования мною исключительных ситуаций(try, cath) Creator выбил "exception handling disabled, use -fexceptions to enable" - что с этим делать?
Это обязано быть в настройках компиляции. У меня называется "enable C++ exceptions" а как в Creator не знаю, им не пользуюсь
Записан
niXman
Гость
« Ответ #14 : Август 12, 2010, 20:07 »

Don't use exeptions? Улыбающийся
вы в своем уме?

blood_shadow, не в курсе какая у вас версия Qt, и откуда вы ее брали, но стОит посмотреть содержание configure.cache на предмет "-exception"
в ранних версиях исключения были отключены по дефолту. приходилось пересобирать.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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