5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
1

Инициализация переменной члена класса

08.08.2015, 08:02. Показов 2168. Ответов 6
Метки нет (Все метки)

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

Имеется класс mainwindow, в нем объявлена переменная rectHashFile и метод addRectHash:

C++ (Qt)
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
//===============mainwindows.h==============//
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
    QHash <QString, QRect> rectHashFile;
 
private:
    QStringList nameFilter;     //filter file extensions
    Ui::MainWindow *ui;
    
    int m_nInitialX;
    int m_nInitialY;
    int m_nFinalX;
    int m_nFinalY;
 
    int countFiles;
    QStringList listClipping;
 
    void addRectHash(int x, int y, int finX, int finY, QStringList fileList, 
                     int currentCountFile, QHash <QString, QRect> hashFile);
 
private slots:
    void metod();
C++ (Qt)
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
30
31
32
33
34
//============mainwindows.cpp==========//
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
/*
код
*/
}
 
void MainWindow::addRectHash(int x, int y, int finX, int finY, QStringList fileList, 
                                     int currentCountFile, QHash<QString, QRect> hashFile)
{
    QRect rect(x, y, finX-x, finY-y);
 
    if(rect.width() > 20 || rect.height() > 20){
        hashFile.insert(fileList[currentCountFile],rect );
    }
 
    //при выводе получаем информацию о внесенных данных
    qDebug()<<"insideHash: "<<hashFile;
}
 
//image slide right
void MainWindow::metod()
{
        //add info with rect to QHash
        addRectHash(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY,
                           listClipping, countFiles, rectHashFile);
 
        //переменная пуста
        qDebug()<<"outside: "<<rectHashFile;
}
Метод addRectHash() добавляет в переменную rectHashFile данные. В Методе metod() мы вызываем addRectHash() и пытаемся внести информацию в переменную rectHashFile, но при выводе полчаем пустую переменную.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2015, 08:02
Ответы с готовыми решениями:

Инициализация константы-члена класса
Все привет! Возникла такая проблема: есть double константа-член класса, объявленная в секции...

Инициализация static члена класса
Добрый вечер! Есть класс, в нём в private реализован ещё один + это всё шаблоны. Во вложенном...

Инициализация статического члена из шаблонного класса
Добрый день. Есть код: template&lt;int test&gt; class Test { template&lt;int a&gt; struct Inner ...

Инициализация члена шаблона класса шаблонным конструктором
Здравствуйте! Есть такой шаблонный класс: template&lt;typename T&gt; class Shared { public: Shared()...

6
802 / 529 / 157
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
08.08.2015, 08:08 2
Maxfashko, тебе сюда
https://www.cyberforum.ru/qt/
0
lss
936 / 864 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
08.08.2015, 08:09 3
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

Чтобы изменения переменной в функции сохранились, передавай её по ссылке, а не по значению.
Но, в данном случае, непонятно зачем, вообще, куда-то её передавать, если эта переменная член класса?
1
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
08.08.2015, 08:13  [ТС] 4
Ferrari F1, там завелся один товарищ-блюдитель закона, который за такие вопросы высмеивает и всякое прочее. Этот вопрос не по Qt больше а по основам.

Добавлено через 2 минуты
lss, эта переменная в дальнейшем будет использоваться в другом классе. Для этого я ее в public поместил. Или это делается не таким способом?
0
lss
936 / 864 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
08.08.2015, 08:34 5
Цитата Сообщение от Maxfashko Посмотреть сообщение
эта переменная в дальнейшем будет использоваться в другом классе. Для этого я ее в public поместил. Или это делается не таким способом?
И что с того? Зачем в метод класса, который и так имеет доступ к данным класса, передавать эти данные?

Добавлено через 12 минут
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void MainWindow::addRectHash()
{
    QRect rect(m_nInitialX, m_nInitialY, m_nFinalX - m_nInitialX, m_nFinalY - m_nInitialY);
 
    if(rect.width() > 20 || rect.height() > 20){
        rectHashFile.insert(listClipping[countFiles], rect);
    }
 
    //при выводе получаем информацию о внесенных данных
    qDebug()<<"insideHash: "<< rectHashFile;
}
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
08.08.2015, 09:18  [ТС] 6
lss, Это был всего пример.
Вот как я представляю себе использование этой переменной в моем случае:


Имеем класс MainWindow, в нем объявлен метод addRectHash в котором добавляем информацию в переменную другого класса GC.rectHashFile.
Так же здесь объявляем класс GrubCut
C++ (Qt)
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
30
31
//===============mainwindows.h==================//
 
#include "grubCut.h"
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
  
private:
    QStringList nameFilter;     //filter file extensions
    Ui::MainWindow *ui;
 
    GrubCut *GC = new GrubCut();
    
    int m_nInitialX;
    int m_nInitialY;
    int m_nFinalX;
    int m_nFinalY;
 
    int countFiles;
    QStringList listClipping;
 
    void addRectHash(int x, int y, int finX, int finY, QStringList fileList, 
                     int currentCountFile, QHash <QString, QRect> hashFile);
 
private slots:
    void metod();
В исходном коде класса MainWindow реализуем все это

C++ (Qt)
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
30
31
32
33
34
35
36
//============mainwindows.cpp==========//
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    
/*
код
*/
}
 
void MainWindow::addRectHash(int x, int y, int finX, int finY, QStringList fileList, 
                                     int currentCountFile, QHash<QString, QRect> hashFile)
{
    QRect rect(x, y, finX-x, finY-y);
 
    if(rect.width() > 20 && rect.height() > 20){
        hashFile.insert(fileList[currentCountFile],rect );
    }
 
    //при выводе получаем информацию о внесенных данных
    qDebug()<<"insideHash: "<<hashFile;
}
 
//image slide right
void MainWindow::metod()
{
        //add info with rect to QHash
        addRectHash(m_nInitialX, m_nInitialY, m_nFinalX, m_nFinalY,
                           listClipping, countFiles, GC.rectHashFile);
 
        //переменная пуста
        qDebug()<<"outside: "<<GC.rectHashFile;
}
Так же имеется класс GrabCut, в нем имеется метод process, и переменная rectHashFile

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
//===================GrabCut.h================//
 
class GrubCut:public QObject
{
    Q_OBJECT
public:
    explicit GrubCut(QObject *parent = 0);
 
    QHash <QString, QRect> rectHashFile;
    void process(QHash <QString, QRect> hash);
и уже в исходном коде класса GrabCut, я использую эту переменную

C++ (Qt)
1
2
3
4
5
//=============GrubCut.cpp================//
 
void GrubCut::process(QHash <QString, QRect> hash){
//обрабатываем данные на основе полученной информации из класса MainWindows
}
Добавлено через 22 минуты
Цитата Сообщение от lss Посмотреть сообщение
Чтобы изменения переменной в функции сохранились, передавай её по ссылке, а не по значению.
Спасибо, передача переменной по ссылке действительно помогла.
0
lss
936 / 864 / 356
Регистрация: 10.10.2012
Сообщений: 2,706
08.08.2015, 18:34 7
Тогда так (бессмысленность предачи данных класса MainWindow у тебя всё равно остаётся):
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void MainWindow::addRectHash(QHash<QString, QRect>& hashFile)
{
    QRect rect(m_nInitialX, m_nInitialY, m_nFinalX - m_nInitialX, m_nFinalY - m_nInitialY);
 
    if(rect.width() > 20 || rect.height() > 20){
        hashFile.insert(listClipping[countFiles], rect);
    }
 
    //при выводе получаем информацию о внесенных данных
    qDebug()<<"insideHash: "<< hashFile;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2015, 18:34

Инициализация константного статического объекта - члена класса
Здравствуйте, у меня возникла проблема с инициализацией статического объекта, который является...

Инициализация константного члена класса с проверкой значения
Допустим есть класс константным членом class a{ const int i; public: a(int...

Инициализация переменной класса
Создаю класс для работы с mysql class MyClass { public: bool Connect() {

Передача значения переменной-члена из класса в функцию
Добрый день, имеется класс: class ZernPole{ public:...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.