Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545

Доступ к приватным полям класса

08.01.2019, 13:30. Показов 2970. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот класс:
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
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
#ifndef STUDENT_H_INCLUDED
#define STUDENT_H_INCLUDED
 
#include "iostream"
#include "string"
#include "iterator"
#include "iomanip"
 
using namespace std;
 
class Student
{
 
private:
 
    int gender;         // Пол ученика
    string fio;         // Фамилия ученика
    double mass;       // Масса ученика
    double growth;    // Рост ученика
 
bool init( int Gender, string Fio, double Mass, double Growth );  // Проверка исходных данных
 
public:
 
void SetGender( int Gender )
{
    gender = Gender;
}
 
void SetFio( string Fio )
{
    fio = Fio;
}
 
void SetMass( double m )
{
    mass = m;
}
 
void SetGrowth( double g )
{
    growth = g;
}
 
int GetGender() const
{
    return gender;
}
 
string GetFio() const
{
    return fio;
}
 
double GetMass() const
{
    return mass;
}
 
double GetGrowth() const
{
    return growth;
}
 
void Read();        // Ввод исходных данных: ФИО, масса, рост
 
void Display();    // Вывод данных на экран
 
double AvarageMassBoys(list<Student>&);              // Вычисление средней массы мальчиков
double AvarageGrowthGirls(list<Student>&);              // Вычисление среднего роста девочек
double StudentMaksGrowth(list<Student>&);    // Нахождение самого высокого роста
};
 
#endif // STUDENT_H_INCLUDED
я делаю двусвязный список и передаю туда класс, но не получается получить доступ к полям класса в void MyList::Add(Node &node)


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
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
#ifndef MYLIST_H_INCLUDED
#define MYLIST_H_INCLUDED
 
#include "student.h"
 
struct Node                             //Структура, являющаяся звеном списка
 {
     Student x;                             //Значение x будет передаваться в список
     Node *Next, *Prev;                 //Указатели на адреса следующего и предыдущего элементов списка
 };
 
 class MyList                              //Создаем тип данных Список
 {
     Node *Head, *Tail;                 //Указатели на адреса начала списка и его конца
public:
     MyList():Head(NULL),Tail(NULL){};    //Инициализируем адреса как пустые
     ~MyList();                           //Прототип деструктора
     void Show();                       //Прототип функции отображения списка на экране
     void Add(Node &node);                   //Прототип функции добавления элементов в список
     int GetSize();  // получаем размер списка
     void Remove(int index);  // удаление по индексу
     void Insert(Node &node, int index); // помещаем новый элемент по заданному индексу
     void Clear(); // ф-я для очищения списка, хотя детруктор и так долен очищать список после работы
 
 };
 
MyList::~MyList()                           //Деструктор
 {
     while (Head)                       //Пока по адресу на начало списка что-то есть
     {
         Tail = Head->Next;             //Резервная копия адреса следующего звена списка
         delete Head;                   //Очистка памяти от первого звена
         Head = Tail;                   //Смена адреса начала на адрес следующего элемента
     }
 }
 
 void MyList::Add(Node &node)
 {
   Node *temp = new Node;               //Выделение памяти под новый элемент структуры
   temp->Next = NULL;                   //Указываем, что изначально по следующему адресу пусто
   temp->x.gender = node.x.GetGender();                         //Записываем значение в структуру
   temp->x.fio = node.x.GetFio();
   temp->x.mass = node.x.GetMass();
   temp->x.growth = node.x.GetGrowth();
 
   if (Head != NULL)                    //Если список не пуст
   {
       temp->Prev = Tail;               //Указываем адрес на предыдущий элемент в соотв. поле
       Tail->Next = temp;               //Указываем адрес следующего за хвостом элемента
       Tail = temp;                     //Меняем адрес хвоста
   }
   else //Если список пустой
   {
       temp->Prev = NULL;               //Предыдущий элемент указывает в пустоту
       Head = Tail = temp;              //Голова=Хвост=тот элемент, что сейчас добавили
   }
 }
Добавлено через 1 минуту
думаю использовать сеттеры, но может есть другой способ получше
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2019, 13:30
Ответы с готовыми решениями:

Callback std::function + доступ к приватным полям класса методам которые не есть их полями
Проблема, товарищи. В прикрепленном архиве 3 файла, из которых состоит моя программа: **main.cpp; prototypes.h; realization.cpp** 1....

Доступ к приватным полям, используя множественное наследование
Здравствуйте. Имею класс A и класс B. В классе A в приватном поле объявляется переменная data типа int: class A { private: int...

Доступ дружественного оператора к приватным данным класса
Здравствуйте. тока начал изучение С++; составляю прогу практически по учебнику - реализация класса Стринг при компиляции компилятор...

11
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.01.2019, 14:14
Не логично в Add передавать Node, скорее это должен быть Student.
C++
1
2
3
4
5
6
void MyList::Add(Student &item)
 {
   Node *temp = new Node;               //Выделение памяти под новый элемент структуры
   temp->Next = NULL;                   //Указываем, что изначально по следующему адресу пусто
   temp->x = item;
 // ...
Доступ к полям тут не нужен, оператор копирования сделает это за вас.
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
08.01.2019, 14:19  [ТС]
valen10, да да только что переделал

Добавлено через 4 минуты
valen10, подскажите какие функции надо сделать чтобы можно было делать бинарный поиск по списку
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.01.2019, 14:27
cherc, недавно же обсуждали этот вопрос. Не решили?

Самое простое - определить оператор произвольного доступа к элементам списка [], который по заданному индексу будет возвращать ссылку на данные. Тогда бинарный поиск можно будет сделать как с обычным массивом. Но как уже говорили, это не эффективно для линейного списка.
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
08.01.2019, 14:29  [ТС]
valen10, знаю что неэффективно, но задание такое.
C++
1
2
3
4
5
6
7
8
9
10
11
Node* MyList::GetStudent(int index)
{
    Node *temp = Head;
    int i = 0;
    while(temp && i < index)
    {
        temp = temp->Next;
        i++;
    }
    return temp;
}
Эта подойдет? Но надо перегрузить [] как я понимаю
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.01.2019, 14:36
Лучший ответ Сообщение было отмечено cherc как решение

Решение

cherc, подойдет. Перегрузка [] является одним из вариантов и делает по смыслу то же самое, но возвращает немного другой результат. Можно использовать и вашу функцию, только работать придется с указателями, вот и вся разница.

Еще вариант: поиск среднего элемента по известным указателям первого и последнего граничных элементов и известному количеству элементов в этих границах. Указатели граничных элементов будут изменяться по результатам сравнения среднего элемента с искомым.
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
08.01.2019, 15:34  [ТС]
поиск то работает, то не работает в чем может быть ошибка?
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
30
31
32
 Node *MiddleBP(Node *Head, Node *Tail)//функция нахождения середины списка
{
    if (Head->Next == NULL) return NULL;//проверка на 1 элемент
    Node *p1 = Head;//объявление
    Node *p2 = Tail;//доп. указателей
    for (;;)//бесконечный цикл
    {
        if (p2->Next != Tail->Next)//если следующий элемент от p2 не равен NULL
        {
            if (p2->Next->Next != Tail->Next)//если следующий от слудующего от p2 не равен NULL
            {
                p1 = p1->Next;//передвигаем указатель p1 на один влево
                p2 = p2->Next->Next;//передвигаеп указатель p2 на два влево
                continue;
            }
        }
        return p1->Next;//возвращаем элемент указывающий на середину
    }
}
 
Node *Recursion(int v, Node *Head, Node *Tail)//функция рекурсии
{
    if (Head == Tail)//если один элемент
    {
        if (Head->x.GetGrowth() == v) return Head;//и если значение этого элемента равно искомому
        else return NULL;//иначе возвращаем NULL
    }
    Node *Pc = MiddleBP(Head, Tail);//Ищем середину и присваиваем Pc
    if (Pc->x.GetGrowth() == v) return Pc;//если значение Pc равно искомому
    if (v<Pc->x.GetGrowth()) return Recursion(v, Head, Pc->Prev);//если искомое значение меньше значения Pc то вызываем рекурсию для Pa и предыдущего от Pc
    else return Recursion(v, Pc, Tail);//иначе вызываем рекурсию для Pc и Pb
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void BinaryFind(Node *head, Node *tail, double &growth)
{
    if (head == NULL || tail == NULL) cout<<"Список пуст"<<endl;
    Node *R = Recursion(growth, head, tail);
    if (R == NULL)
    {
        cout << endl << "Элемент не найден!" << endl;
        return;
    }
    else
    {
        cout << "--------------------------------------" << endl;
        cout << R->x.GetFio() << "|" << setw(5) << R->x.GetMass() << " кг" << "|" << setw(5) << R->x.GetGrowth() << " м" << "|" << endl;
    }
}
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.01.2019, 15:49
cherc, как-то непонятно вы двигаете указатели при поиске середины. Если бы это был двусвязный список, то можно было двигать указатели навстречу друг другу, пока не встретятся. Работая с односвязным списком середину можно найти только основываясь на количестве элементов. Их можно посчитать или вычислять. Первое безопаснее, второе быстрее.
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
08.01.2019, 18:09  [ТС]
все
0
08.01.2019, 18:16

Не по теме:

Цитата Сообщение от cherc Посмотреть сообщение
все
Всё получилось или всё надоело?

0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
08.01.2019, 18:38  [ТС]
valen10, тупой вопрос задал, и быстро удалил .

Добавлено через 21 минуту
valen10, все равно не могу этот бинарный поиск сделать. в Node *MiddleBP(...) есть 2 указателя. 1 сдвигаем на 2 другой на 1, когда 1 достигнет конца второй будет указывать на середину. Вроде должно работать а он пишет элемент не найден
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
08.01.2019, 21:10
Лучший ответ Сообщение было отмечено cherc как решение

Решение

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

Кликните здесь для просмотра всего текста
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
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <iostream>
using namespace std;
 
template<typename T>
struct Node {
    T data;
    Node *next;
};
 
template<typename T>
class List;
 
template<typename T>
ostream &operator<<(ostream &out, List<T> &list) {
    Node<T> *current = list.m_head;
    if (current == nullptr) {
        out << "<empty>";
    }
 
    while (current != nullptr) {
        out << current->data << " ";
        current = current->next;
    }
 
    return out;
}
 
template<typename T>
class List {
    Node<T> *m_head;
 
    static void recursiveInsert(Node<T> *&head, const T &value) {
        if ((head != nullptr) && (head->data < value)) {
            recursiveInsert(head->next, value);
        }
        else if ((head == nullptr) || (head->data >= value)) {
            Node<T> *node = new Node<T>;
            node->data = value;
            node->next = head;
            head = node;
        }
    }
 
    static Node<T> *getMiddle(Node<T> *left, Node<T> *right) {
        // Указатели начинают движение от начала.
        // p1 смещается на 1 позицию.
        Node<T> *p1 = left;
        // p2 смещается на 2 позиции.
        Node<T> *p2 = left;
 
        // Пока не достигнута правая граница.
        while (p2 != right) {
            // Первый шаг p2.
            p2 = p2->next;
            // Если он приводит к достижению правой границы.
            if (p2 == right) {
                // Завершаем смещение указателей.
                break;
            }
 
            // Иначе смещение обоих указателей продолжается.
            p1 = p1->next;
            p2 = p2->next;
        }
 
        /* p1 после смещения должен указывать на элемент
         * посередине между left и right.
         */
        return p1;
    }
 
public:
    List(): m_head(nullptr) {
        /* pass */
    }
 
    ~List() {
        while (m_head != nullptr) {
            auto next = m_head->next;
            delete m_head;
            m_head = next;
        }
    }
 
    void insert(const T &value) {
        recursiveInsert(m_head, value);
    }
 
    Node<T> *find(const T &value) {
        /* Если список пуст или искомое значение меньше всех
         * элементов списка, то ничего не найдено.
         */
        if ((m_head == nullptr) || (value < m_head->data)) {
            return nullptr;
        }
 
        /// Указатель на первый элемент.
        Node<T> *left = m_head;
        /// Указатель на элемент справа от последнего.
        Node<T> *right = nullptr;
 
        // Пока рассматривается непустой участок списка.
        while (left != right) {
            Node<T> *middle = getMiddle(left, right);
 
            if (value <= middle->data) {
                right = middle;
            }
            else {
                left = middle->next;
            }
        }
 
        if ((right != nullptr) && (right->data == value)) {
            // Искомый элемент найден.
            return right;
        }
        else {
            // Искомый элемент не найден.
            return nullptr;
        }
    }
 
    friend ostream &operator<< <>(ostream &, List &);
};
 
int main() {
    List<int> list;
    cout << list << endl;
    list.insert(1);
    list.insert(5);
    list.insert(2);
    list.insert(4);
    list.insert(7);
    list.insert(8);
    list.insert(9);
    list.insert(6);
    list.insert(10);
    cout << list << endl;
 
    for (int i = 0; i <= 12; i++) {
        auto item = list.find(i);
        if (item) {
            cout << item->data << endl;
        }
        else {
            cout << i << " Not found." << endl;
        }
    }
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.01.2019, 21:10
Помогаю со студенческими работами здесь

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

Доступ к полям класса
Имеет список list с объектами класса zapis list&lt;zapis&gt; list как мне получить значение поля класса, например поле Number

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

Доступ к private полям класса
Есть класс Student и список list который заполняется экземплярами класса. Потом этот список сортируем по росту ( обращаюсь к полю growth ),...

Дружественная функция-оператор, доступ к закрытым полям класса
У меня есть класс MyClass, вот код: class MyClass { int x, y; public: MyClass(); friend ostream &amp; operator &lt;&lt;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru