Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 13.02.2018
Сообщений: 4

Проверка в объявлении класса

13.02.2018, 16:17. Показов 782. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
почему нет темы для "очень начинающих"? =)
не кидайте в меня тапками. Но у меня такой вопрос. Вот я создала отдельный классс блэкджеком и шлюхами со своими плюшками. Все чин по чину в header'e в public добавила объявление этого самого класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef TEST_H
#define TEST_H
 
#include <QObject>
 
class Test : public QObject
{
    Q_OBJECT
 
public:
    explicit Test(int val, QObject *parent = 0);
    int function();
//еще парочка функций
    ~Test();
 
signals:
 
public slots:
 
private:
QList<double> standard;
   //Разные переменные и функции, которые хочется использовать внутри класса 
};
 
#endif // TEST_H
в самом cpp'эшном файле пишу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "Test.h"
#include <QDebug>
#include <QtMath>
 
Test::Test(int val, QObject *parent) :
    QObject(parent)
{
    Val=val;
    //get some values from database
    QString dotsTable = "mes";
    standard = psql->Getval(dotsTable);
    
}
 
Test::~Test()
{
 
}
когда в корне программы я создаю новый объект этого класса и выполняю функции внутри него, то мне приходится в каждой функции проверять, есть и в бдушечке нужная для этого класса информация (), или перед объявлением этого класса спрашивать есть ли там нужная информация (то бишь а не пустой ли этот список standart). можно ли как-то в объявлении добавить проверку, что если такой информации нет, то сущность этого класса не создавать и дальнейших действий не производить?
C++
1
2
3
  Test * rfTest = new Test(3);
 
        int result = rfTest->function();
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.02.2018, 16:17
Ответы с готовыми решениями:

Найти ошибку в объявлении класса
в чём дело? #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Division_by_zero { public: string...

Ошибка в объявлении класса (в конструкторе)
Я не могу разобраться с классами и конструкторами, в строчке Progect();// {numb=0; sum=0; date=;} всегда высвечивает ошибку,...

Найдите ошибку в объявлении класса
class String { protected: char *str; unsigned len; public: String(); String(const char* s); ...

15
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.02.2018, 17:21
Цитата Сообщение от gnusmass Посмотреть сообщение
можно ли как-то в объявлении добавить проверку, что если такой информации нет, то сущность этого класса не создавать
Объект класса Test не создавать?
0
2 / 2 / 0
Регистрация: 13.02.2018
Сообщений: 4
13.02.2018, 17:47  [ТС]
получается в бдушечку мне надо лезть до объявление класса, да? а то, что получилось просто передавать в качестве переменной или ссылки на эти переменные?

но мне так нравилось что эти объекты живут внутри класса(
просто я думала, что есть какая-то хитрая функция чтобы если что-то пошло не так, он не создавал класс и выдавал какую-нибудь ошибку
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
13.02.2018, 18:02
Цитата Сообщение от gnusmass Посмотреть сообщение
просто я думала, что есть какая-то хитрая функция чтобы если что-то пошло не так, он не создавал класс и выдавал какую-нибудь ошибку
static_assert? http://en.cppreference.com/w/c... tic_assert

Не по теме:

Цитата Сообщение от gnusmass Посмотреть сообщение
получается в бдушечку мне надо лезть до объявление класса, да? а то, что получилось просто передавать в качестве переменной или ссылки на эти переменные?
Меня одного привлекают такие девушки?



Добавлено через 3 минуты
Цитата Сообщение от gnusmass Посмотреть сообщение
получается в бдушечку мне надо лезть до объявление класса, да?
А mock создать для psql?

Добавлено через 4 минуты
https://github.com/google/googlemock
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.02.2018, 18:17
Выкинуть исключение из конструктора?
1
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
13.02.2018, 19:20
Цитата Сообщение от Croessmah Посмотреть сообщение
Выкинуть исключение из конструктора?
Плохая практика, чревато утечками памяти...
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.02.2018, 20:03
Цитата Сообщение от outoftime Посмотреть сообщение
Плохая практика, чревато утечками памяти...
Да ладно? У всех нормально, а у кого-то утечки. Исключение в конструкторе - средство соблюдения инварианта.

https://isocpp.org/wiki/faq/ex... exceptions и далее по тексту.
2
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
13.02.2018, 20:18
Croessmah,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <exception>
 
class A
{
    int *a;
    void log(const char *msg) { std::cout << msg << std::endl; }
 
  public:
    A()
    {
        log("Constructor called");
        a = new int[100500];
        throw std::exception();
    }
    ~A() { log("Destructor called"); }
};
 
int main()
{
    try
    {
        A();
    }
    catch (std::exception &ex)
    {
    }
}
$ g++ -Wall -Wextra -Wstrict-aliasing -pedantic -Werror -Wunreachable-code -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses -fdiagnostics-show-option --std=c++11 -fexceptions -O3 -o run run.cpp
$ ./run
Constructor called


Добавлено через 34 секунды
Чет не то случилось, выделился массив на 100500 объектов и не подчистился...

Добавлено через 1 минуту
Но я уже уверовал в то, что это никакого отношения к утечкам памяти не имеет, так что всё хорошо, жизнь прекрасна.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.02.2018, 20:33
Цитата Сообщение от outoftime Посмотреть сообщение
Но я уже уверовал в то, что это никакого отношения к утечкам памяти не имеет
Не имеет.
C++
1
2
3
4
5
6
void foo()
{
        int * a = new int[100500];
        throw std::exception();
        delete [] a;
}
утечка. Какое отношение не умение использовать исключения и обеспечивать гарантии относятся к проблемам исключений в конструкторе?
Люди знают, что если конструктор не завершил работу, то деструктор вызван не будет.

Можно, например, взять умный указатель.
А еще если использовать делегирующий конструктор, который завершит работу, то деструктор будет вызван:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class A
{
    int *a;
    void log(const char *msg) { std::cout << msg << std::endl; }
 
  public:
    
    A(): A(0)
    {
        throw std::exception();
    }
    ~A() { log("Destructor called"); }
    private:
    A(int) {
        log("Constructor called");
        a = new int[100500];
    }
};
 
int main()
{
    try
    {
        A();
    }
    catch (std::exception &ex)
    {
    }
}
И опять, причем здесь исключения в конструкторе? Можно что угодно использовать не умеючи и добиться утечек памяти без проблем. Это не проблема исключений.

По той же теории
C++
1
2
3
4
5
6
void foo()
{
        int * a = new int[100500];
        return;
        delete [] a;
}
return - плохая практика, чревато утечками памяти...
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.02.2018, 10:09
Цитата Сообщение от gnusmass Посмотреть сообщение
но мне так нравилось что эти объекты живут внутри класса(
Пусть там и живут. Я знаю 2 пути для решения такой задачи.
1. Выбросить исключение из конструктора и почистить всё что уже захапано, в том числе зашкрябано в бдушечку if any.
2. Создавать экземпляры свободным friend методом, а ещё лучше - статическим. Анализировать всё что будет жить в экземпляре (до его создания) внутри такого метода, это во всяком разе не намного больший грех чем назвать DB бдушечкой. Всё отмолится при истовом и искреннем отношении. То есть, расширьте интерфейс статическим методом. Это удобно и гигиенично. Но несколько объёмно.
0
2 / 2 / 0
Регистрация: 13.02.2018
Сообщений: 4
14.02.2018, 15:48  [ТС]

Не по теме:

Цитата Сообщение от outoftime Посмотреть сообщение
Меня одного привлекают такие девушки?
по опыту скажу - да :(



Цитата Сообщение от outoftime Посмотреть сообщение
скорее всего это мне не подойдет, т.к. этот QList<double> standard у меня не константа, и более того, заполняю я его из базы. и вот идея была, что если в базе нет данных и этот qlist в конечном итоге остается пустым, то тогда не создавать класс и того мне одна проверка, вместо десятка в каждой функции этого класса - а есть ли вообще этот qlist или нет

по поводу анализа и запроса из бдушечки данных и потом его передавать в качестве переменных поняла. просто хотелось, чтобы эти данные жили только в этом классе.

Добавлено через 31 минуту
c exception работает как надо))) пришлось правда всю эту большую и громоздкую работу с этим классом поместить в try/catch
но оно того стоило)
0
14.02.2018, 16:20

Не по теме:

Цитата Сообщение от outoftime Посмотреть сообщение
Меня одного привлекают такие девушки?
бро держи себя в руках вспомни что Ты программист. Поставь кружечку пива на пузо, почеши бороду, мыслено сматери виндовс и вспомни тот счасливый день когда Ты перешел на линь.

0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
14.02.2018, 16:36
gnusmass, не совсем понятен ваш уровень.

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

Так как у вас есть обращение к базе данных, надо чтобы psql->Getval(dotsTable); возвращал в точности то значение которое нужно протестировать а не то что есть в базе. Если надо протестировать отдельно работу psql тогда пишутся тесты чисто для него. Если надо протеститровать сеть - пишутся тесты для сети.

В любом случае, тестирование это когда вы задаете входные значения функции и проверяете соответсвующий результат выполнения. В функциональных языках это сделать проще, на плюсах надо немного извращаться.

Цитата Сообщение от gnusmass Посмотреть сообщение
c exception работает как надо)))
Опять таки для того чтобы прогнать тесты нужно иметь запущеный postgres server, настроить права доступа, создать таблицы и заполнить данными. Всё это должно быть в тестах а не где-то "там".

С другой стороны, если вопрос не касается тестирования, всё выше сказанное не имеет смысла.

Добавлено через 5 минут

Не по теме:

Цитата Сообщение от gnusmass Посмотреть сообщение
по опыту скажу - да
ИМХО, история очень похожа с древними "обрадами" подготовки к охоте. Даже в наши дни, в Африке проводят такие обряды перед охотой. Если рассматривать эти обряды с психологической точки зрения, люди настраиваются на выполение определенной работы. Что интересно, есть еще обряд завершения охоты. Когда нужно забыть чем ты занимался только что и дальше заниматься "своим" делом. Это я к тому, что при "спринтерской жизни" люди не проводят для себя никаких обрадов, и в результате выходит то что описано в стихе Лермонтова:

Смешались в кучу кони, люди,
И залпы тысячи орудий

Слились в протяжный вой...



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от 1Вирт1 Посмотреть сообщение
бро держи себя в руках вспомни что Ты программист. Поставь кружечку пива на пузо, почеши бороду, мыслено сматери виндовс и вспомни тот счасливый день когда Ты перешел на линь.
Как говорится: "Судят по себе". У меня есть проблемы, но советов я не спрашивал. Спасибо за понимание!

0
184 / 192 / 48
Регистрация: 25.08.2011
Сообщений: 792
14.02.2018, 17:04
Цитата Сообщение от Croessmah Посмотреть сообщение
https://isocpp.org/wiki/faq/exceptions#ctor-exceptions
отличное чтиво для освежения памяти
0
2 / 2 / 0
Регистрация: 13.02.2018
Сообщений: 4
15.02.2018, 14:10  [ТС]
Цитата Сообщение от outoftime Посмотреть сообщение
не совсем понятен ваш уровень.
уровень начинающий

почему тестирование-то? программа обращается к базе за данными, хочется, чтобы проверка была в коде на отсутствие\присутствие этих данных. То бишь, если вдруг данных нет, она не падала, а мягко закрывалась и обращалась за данными через какое-то время)

Не по теме:

Цитата Сообщение от outoftime Посмотреть сообщение
ИМХО, история очень похожа с древними "обрадами" подготовки к охоте. Даже в наши дни, в Африке проводят такие обряды перед охотой. Если рассматривать эти обряды с психологической точки зрения, люди настраиваются на выполение определенной работы. Что интересно, есть еще обряд завершения охоты. Когда нужно забыть чем ты занимался только что и дальше заниматься "своим" делом. Это я к тому, что при "спринтерской жизни" люди не проводят для себя никаких обрадов, и в результате выходит то что описано в стихе Лермонтова:
Вы знаете, в 20 веке был такой Эрик Берн, который был модным на тот момент психологом и написал пару книг. Он ввел понятие - негативные и позитивные поглаживания, утверждая, что именно так люди общаются друг с другом: обмениваются своего рода реакциями на других людей. В это понятие входит все - от физических контактов (обнимашки, поцелуи, толчки, хлопок по спине, секс в конце концов) до визуальных (отвернуться от собеседника, смотреть свысока, держать зрительный контакт) соответственно с их разной очевидной или не очень направленностью. Так вот люди такие поглаживания используют на подсознательном уровне, рассчитывая, что другие будут на этом же подсознательном уровне их понимать (нет). Так вот мое сообщение было реакцией на ваше такое "положительное поглаживание" - печальной самоиронией, основанной на собственном опыте. Также неся с собой исключительно положительный посыл.
а Лермантов прав. да. смешались в кучу кони, люди....

2
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
15.02.2018, 17:30
Цитата Сообщение от gnusmass Посмотреть сообщение
почему тестирование-то? программа обращается к базе за данными, хочется, чтобы проверка была в коде на отсутствие\присутствие этих данных. То бишь, если вдруг данных нет, она не падала, а мягко закрывалась и обращалась за данными через какое-то время)
Теперь становится понятным значение

Цитата Сообщение от gnusmass Посмотреть сообщение
можно ли как-то в объявлении добавить проверку, что если такой информации нет, то сущность этого класса не создавать и дальнейших действий не производить?
Цитата Сообщение от gnusmass Посмотреть сообщение
просто я думала, что есть какая-то хитрая функция чтобы если что-то пошло не так, он не создавал класс и выдавал какую-нибудь ошибку
Изначально думал что решается задача тестирования...

Судя по http://en.cppreference.com/w/cpp/error лучше всего сделать свой класс унаследовавшись от std::runtime_error http://en.cppreference.com/w/c... time_error

Так можно будет точно узнать почему имеено было брошено исключение, без копания в тексте ошибки.

Если Вам ближе Qt, можно использовать QException http://doc.qt.io/qt-5/qexception.html но быть вкурсе этой статьи: https://doc.qt.io/qt-5.10/exceptionsafety.html

Не по теме:

Ура! Америку открыл!



Добавлено через 1 час 50 минут

Не по теме:

Цитата Сообщение от gnusmass Посмотреть сообщение
Так вот мое сообщение было реакцией на ваше такое "положительное поглаживание"
Не смотря на самохвальство, моей конечной целью было донести определенную мысль, о которой Вы могли не знать. И хочется отметить еще парочку:

1. Эрик, возможно, был хорошим доктором (изначальное значение было "тот кто разбирается в своем деле"). Но нужно понимать что его работы основаны на определенном фундаменте. Он может быть теоретический (работы других) или практический (опыты, эксперименты или наблюдения "из жизни"). Само рвение к знаниям - похвально, даже очень. Но нужно видеть полную картину, это очень важно чтобы понимать

Цитата Сообщение от gnusmass Посмотреть сообщение
Так вот люди такие поглаживания используют на подсознательном уровне, рассчитывая, что другие будут на этом же подсознательном уровне их понимать (нет)
что именно хочет донести автор. Вышесказанное в двух словах: если беретесь что-то изучать - не оставляйте пробелов в понимании.

2. Есть знания, понимание и осознание. Первое получить проще всего, нужно просто выучить, как стих зазубрить на изусь. Понимание приходит немного потом, когда Вы можете чётко видеть всю картину происходящих процессов на основании Ваших знаний. А что тогда осознание? В определенном приближении, это когда ваши действия основываются на понимании.

Наример, вы же не станете ругать ребенка за проступок, когда он весь зажался от стыда. Ваша цель научить, а значит объяснить. Если он защищается нужно не наращивать его защиту а снять ее и показать что произошло, чтобы донести до него суть.

Если Вы посмотрите еще раз на этот пример, Вы увидите что я описал только ту часть которая не отображает личностные особенности. Уже не секрет, что сделал я это умышленно.

3. (сейчас уже желания писать поубавилось, напишу кратко) Есть такое прекрасное слово "Совесть". Если присмотреться, лозунги звучать со словом "хорошо" не указывая кому, при этом забывая о совести. Если спросить человека чего он хочет, он ответит "чтобы было хорошо" и никто не скажет "чтобы было по-совести". Поэтому, это больше как мое личное пожелание: "применяйте знания по-совести и живите по-совести".

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2018, 17:30
Помогаю со студенческими работами здесь

Инициализация членов в объявлении класса
В классе: class peltier { public: material p = material('p'); material n = material('n'); peltier(); ~peltier(void); };

Ошибка при объявлении функции класса
функция определена: class krug{ // ... void sr(krug ob); // ... } // ... void krug::sr(krug ob){ double s1,s2;

Найти ошибку в объявлении метода класса
Здравствуйте. Не могу понять, где ошибка и в чем она. И как следует писать лучше? По идее поля класса должны заполняться с клавиатуры. ...

Конструкция =delete в объявлении конструкторов класса
объясните пожалуйста что за конструкция такая &quot;=delete&quot; в примерах: Arena(const Arena&amp; other) = delete; Arena&amp; operator =(const...

Новый тип данных в объявлении метода класса
Здравствуйте, подскажите, пожалуйста, как сделать, чтобы метод класса мог принимать как аргумент массив, тип данных которого был определен...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru