Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
n1b1ru
235 / 92 / 45
Регистрация: 22.01.2017
Сообщений: 360
1

Доступ к одной переменной двух классов

24.01.2017, 21:34. Просмотров 1115. Ответов 11
Метки нет (Все метки)

Здавствуйте.
Есть два класса. Первый создаёт данные. Второй эти данные исправляет, перезаписывает, удаляет и т. д.
В какую переменную сохранить эти данные чтобы доступ к ней был только у этих классов?
Пытался в protected, но реализовать наследование второго класса из первого не удаётся...
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2017, 21:34
Ответы с готовыми решениями:

Доступ к объекту сразу из двух классов (наследование)
Здравствуйте, возможно нужен не столько ответ сколько просто хорошее техническое решение. Это...

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

С помошью одной функции посчитать результат для двух классов
//С помощью функции friend obrab подсчитать сумму матрицы и массива. Ошибки выдаёт не опйму почему....

Нужно ли синхронизировать доступ к переменной из двух потоков?
Допустим есть два потока: основной и вторичный. 1. И допустим есть глобальная переменная bool b;...

11
Alex Smith
16 / 16 / 7
Регистрация: 08.10.2016
Сообщений: 48
24.01.2017, 21:44 2
Почему не удается?
0
n1b1ru
235 / 92 / 45
Регистрация: 22.01.2017
Сообщений: 360
24.01.2017, 21:51  [ТС] 3
Alex Smith, я где-то туплю, у меня объект наследуемого класса открывает родителя
0
Alex Smith
16 / 16 / 7
Регистрация: 08.10.2016
Сообщений: 48
24.01.2017, 22:00 4
Открывает? Это виджеты?

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

Я не знаю вашу задачу, но возможно вам надо посмотреть в сторону дружественных классов, а не наследования. Дружественные классы имеют доступ к приватным полям класса с которым дружат.
1
n1b1ru
235 / 92 / 45
Регистрация: 22.01.2017
Сообщений: 360
24.01.2017, 22:07  [ТС] 5
Alex Smith, да, там не вариант наследовать, дополнять нечего.
Цитата Сообщение от Alex Smith Посмотреть сообщение
возможно вам надо посмотреть в сторону дружественных классов
Хорошо, буду копать
0
ValeryS
Модератор
8088 / 5969 / 791
Регистрация: 14.02.2011
Сообщений: 20,586
Завершенные тесты: 1
25.01.2017, 04:41 6
Цитата Сообщение от n1b1ru Посмотреть сообщение
Есть два класса. Первый создаёт данные. Второй эти данные исправляет, перезаписывает, удаляет и т. д.
на мой взгляд не правильная архитектура
я бы сделал три класса
первый работает с данными: создает, удаляет, правит ну и так далее
из него наружу торчат методы
второй класс использует методы создания
третий - правки, удаление и пр.
при таком подходе контроль за данными находится внутри одного класса, а не разбросан по всей программе
0
SkaDi
14 / 13 / 4
Регистрация: 30.09.2015
Сообщений: 128
25.01.2017, 11:12 7
Цитата Сообщение от ValeryS Посмотреть сообщение
я бы сделал три класса
первый работает с данными: создает, удаляет, правит ну и так далее
из него наружу торчат методы
второй класс использует методы создания
третий - правки, удаление и пр.
для чего 3 класса я так и не понял, но вы говорите верно, то что обработка всех данных, должна производиться внутри 1го класса, где эти данные создаются, а для каждой манипуляции с этими данными пишется свой метод, именно так сохранится принцип инкапсуляции, и будет обеспечена безопасность данных.

если же на безопасность вам плевать, то можно просто передать указатель на эти данные во второй класс, и ломать их как вам захочется.
0
Горбаг
182 / 174 / 57
Регистрация: 25.09.2014
Сообщений: 828
Завершенные тесты: 2
25.01.2017, 12:17 8
n1b1ru, может лучше сразу раскрыть задачу, чтобы люди не гадали?
0
ValeryS
Модератор
8088 / 5969 / 791
Регистрация: 14.02.2011
Сообщений: 20,586
Завершенные тесты: 1
25.01.2017, 13:14 9
Цитата Сообщение от SkaDi Посмотреть сообщение
для чего 3 класса я так и не понял
потому что у ТС есть уже два класса
Цитата Сообщение от n1b1ru Посмотреть сообщение
Есть два класса. Первый создаёт данные. Второй эти данные исправляет, перезаписывает, удаляет и т. д.
вот я и предложил добавить третий, который все это будет делать с данными, а первые два будут общаться с третьим через интерфейс
0
n1b1ru
235 / 92 / 45
Регистрация: 22.01.2017
Сообщений: 360
27.01.2017, 20:29  [ТС] 10
Цитата Сообщение от ValeryS Посмотреть сообщение
я бы сделал три класса
Был 3-ий класс. В целом не понадобился.
Цитата Сообщение от SkaDi Посмотреть сообщение
если же на безопасность вам плевать
А что не так с безопасностью? На данный момент я отправляю данные во второй класс параметром конструктора.
Цитата Сообщение от Горбаг Посмотреть сообщение
n1b1ru, может лучше сразу раскрыть задачу, чтобы люди не гадали?
Всё кое-как работает, не вижу смысла выкладывать весь код. Ниже один слот, может что посоветуете:
Кликните здесь для просмотра всего текста
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
void Glob::displayData(const QString& path)
{
    QFile inputFile;
 
    inputFile.setFileName(QCoreApplication::applicationDirPath() + "/Data/" + path);
 
    QStringList lst;
 
    if(inputFile.open(QIODevice::ReadOnly))
    {
        QTextStream in(&inputFile);
        while(!in.atEnd())
        {
            QString line = in.readLine();
            lst << line;
        }
    } else {
        QMessageBox::information(0, tr("Error"), inputFile.errorString());
    }
 
    inputFile.close();
 
    if(!lst.isEmpty())
    {
        int i = 0;
        foreach(QString str, lst)
        {
            QString text = "";
            QString dataItem = "";
            if(str.isEmpty()) // Если сталкиваемся с пустой значит следующая строка текст QCheckBox
            {
                lst.removeFirst(); // Удаляем строку
                QCheckBox* chkBox = new QCheckBox(lst.first()); // Создаём QCheckBox с текстом
                                                                // следующей строки
                chkBox->setChecked(true);
 
                chkBox->setFont(QFont("Arial", 10, QFont::Bold));
 
                layout->addWidget(chkBox); // Отображаем QCheckBox
                dataItem.append(lst.first() + "\n");
                lst.removeFirst();
                
                // Весь остальной текст до следующей пустой строки пойдёт в QLabel
                foreach(QString subStr, lst)
                {
                    if(subStr.isEmpty())
                    {
                        break;
                    }
 
                    text.append(subStr + "\n");
                    lst.removeFirst();
                }
 
                dataItem.append(text);
 
                QPushButton* btn = new QPushButton(tr("Edit")); // Кнопка для изменения данных в QLabel
                btn->setFixedWidth(100);
                btn->setObjectName("btn_" + QString::number(i));
                // editButton() создаёт объект второго класса
                connect(btn, SIGNAL(clicked()), SLOT(editButton())); 
                
                // QLabel с текстом
                QLabel* lbl = new QLabel(text);
                lbl->setObjectName("lbl_" + QString::number(i));
                
                // Отображаем QLabel и QPushButton
                layout->addWidget(lbl);
                layout->addWidget(btn);
                text = "";
                data << dataItem; // Данные которые будут отправлены во второй класс
                dataItem.clear();
                ++i;
            }
        }
    }
}

У меня есть текст в файлах, который сохранён следующим образом:
Кликните здесь для просмотра всего текста


Поле1
Текст Поля1 Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum

Поле2
Текст Поля2 Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum

Поле3
Текст Поля3 Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum
Lorem Ipsum Lorem Ipsum Lorem Ipsum


Слот displayData создаст
QCheckBox с текстом Поле1
QLabel с текстом Текст Поля1 Lorem Ipsum Lorem Ipsum... до пустой строки
и QPushButton.
Количество виджетов зависит от текста с пустыми строками в файле.
Мне это всё неочень нравится, хоть и работает. Как лучше сохранить данные в файлы?
Может использовать базу данных вместо файлов? Это пока главная проблема. Потом с классами разберусь.
0
SkaDi
14 / 13 / 4
Регистрация: 30.09.2015
Сообщений: 128
30.01.2017, 09:53 11
Лучший ответ Сообщение было отмечено n1b1ru как решение

Решение

я бы писал данные для поля в 1ну строку, с идентификатормом поля:
Код
Поле1@Текст Поля1 Lorem Ipsum Lorem IpsumLorem Ipsum Lorem Ipsum Lorem IpsumLorem Ipsum Lorem IpsumLoremIpsum
Поле2@Текст Поля2 Lorem Ipsum Lorem IpsumLorem Ipsum Lorem Ipsum Lorem IpsumLorem Ipsum Lorem IpsumLoremIpsum
Поле3@Текст Поля3 Lorem Ipsum Lorem IpsumLorem Ipsum Lorem Ipsum Lorem IpsumLorem Ipsum Lorem IpsumLoremIpsum
вытаскиваем
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
    
    QFile inputFile;
    
       inputFile.setFileName(QCoreApplication::applicationDirPath() + "/Data/" + path);
     
       QList<QString> list;
       
       if(inputFile.open(QIODevice::ReadOnly))
       {
           while(!inputFile.atEnd())
           {
               list<<inputFile.readLine();
           }
       } 
       else 
       {
           QMessageBox::information(0, tr("Error"), inputFile.errorString());
       }
    
       inputFile.close();
    
        for(int i=0;i<list.count();i++)
        {
            QString dataItem = "";
            
            QCheckBox* chkBox = new QCheckBox(list[i].left(list.indexOf("@"))); // Создаём QCheckBox с текстом
                                                                                // следующей строки
            list[i].remove(0,list[i].indexOf("@")+1);
            dataItem.append(list[i]);                  //данные для поля
            
        }
класс хранения и обработки данных
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
#ifndef DATACONTROL_H
#define DATACONTROL_H
 
#include <QObject>
#include <QString>
#include <QList>
class DataControl : public QObject
{
    Q_OBJECT
public:
    explicit DataControl(QObject *parent = 0);
 
signals:
    
private:
    QList<QString> currentData;
 
public slots:
    QString data(int dataIndex);        //возвращает текущие данные
    
    //делаем обработчики на любой случай жизни, какой нам только нужен
    bool deleteData(int dataIndex);                     //удалить данные
    bool addData(QString newData);                      //Добавить данные
    bool changeData(int dataIndex,QString newData);     //Изменить данные
    
    //и тд и тп , все что вам нужно делать с данными
    
    // создаете экземпляр класса, и передаете указатель на него 
    // хоть в 100 других классов, которые должны работать с данными
    
    
};
 
#endif // DATACONTROL_H
1
n1b1ru
235 / 92 / 45
Регистрация: 22.01.2017
Сообщений: 360
30.01.2017, 21:39  [ТС] 12
SkaDi, спасибо. Я всё-таки решил использовать БД, но ваш вариант с файлами адекватней моего
0
30.01.2017, 21:39
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2017, 21:39

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

Работа с одной переменной в двух классах
Как из класса &quot;FormА.cs&quot; переменную &quot;А1&quot; сделать доступной в классе &quot;FormB.cs&quot; ? Говорят нужно...

Использование одной переменной в двух потоках
Здравствуйте! Подскажите пожалуйста, каким образом можно вызвать метод и присвоить его результат...

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

Символьное умножение двух многочленов от одной переменной
Здравствуйте, помогите пожалуйста реализовать данный код на языке Haskell. (defun poly-add...


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

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

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