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

Как получить private переменную класса, функцей членом другого класса

21.12.2012, 19:18. Показов 19198. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Игра змейка:

Есть класс поле в котором содержится размеры поля:

C++
1
2
3
4
5
6
7
8
9
class field
{
private:
    int FIELD_START;
    int FIELD_WIDTH_X;
    int FIELD_WIDTH_Y;
public:
...
}
и есть класс змейка
которая должна проверять границы поля в классе field

C++
1
2
3
4
5
6
7
8
class snake
{
private:
...
public:
 
    void SnakeRun();
}
функция SnakeRun()
должна получить:
int FIELD_START;
int FIELD_WIDTH_X;
int FIELD_WIDTH_Y;
из класса field.

не могу никак разобрать как это сделать
Помогите мне.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2012, 19:18
Ответы с готовыми решениями:

Ввод вывод переменной класса, являющейся членом другого класса
Приветствую! У меня есть 2 класса: подкласс filling: class filling { private: int number; char *name; float filmass;

Получить константу из экземпляра класса, который является членом другого класса
class test { const STATUS = 1; } $a = new test(); echo $a::STATUS . PHP_EOL; // работает class bar {

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

20
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.12.2012, 19:26
1 ввести в класс field функции получения нужных членов
2 объявить класс snake дружественным(frend) классу field
но по моему члены должны быть не private: а protected:
0
 Аватар для SummerRain
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
21.12.2012, 22:52
сделай друга этого класса

C++
1
2
3
4
5
6
7
8
9
10
class field
{
private:
    int FIELD_START;
    int FIELD_WIDTH_X;
    int FIELD_WIDTH_Y;
public:
    friend void SnakeRun();
    ...
}
если с "друзьями" не охота заморачиваться, то добавь медоты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class field
{
private:
    int FIELD_START;
    int FIELD_WIDTH_X;
    int FIELD_WIDTH_Y;
public:
    int getFieldStart()
    {
        return FIELD_START;
    }
    int getWidth_X()
    {
        return FIELD_WIDTH_X;
    }int getWidth_Y()
    {
        return FIELD_WIDTH_Y;
    }
...
}
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.12.2012, 22:58
Цитата Сообщение от SummerRain Посмотреть сообщение
сделай друга этого класса
друзья не видят private нужен protected
0
 Аватар для SummerRain
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
21.12.2012, 23:16
Цитата Сообщение от ValeryS Посмотреть сообщение
друзья не видят private нужен protected
этот компилируемый код говорит об обратном
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
#include <string>
#include <iostream>
 
class Student
{
private:
    int m_age;
    std::string m_name;
public:
    Student(std::string name, int age)
        : m_name(name), m_age(age) {}
    ~Student() {}
    std::string getName()
    {
        return m_name;
    }
    int getAge()
    {
        return m_age;
    }
    friend void addAge(Student* s);
};
 
void addAge(Student* s)
{
    s->m_age++;
}
 
void main()
{
    Student Peter("Petya", 20);
    std::cout << Peter.getAge() << std::endl;
    addAge (&Peter);
    std::cout << Peter.getAge() << std::endl;
    system("pause");
}
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
21.12.2012, 23:34
Цитата Сообщение от SummerRain Посмотреть сообщение
этот компилируемый код говорит об обратном
ладно признаю
друзей с родственниками попутал
0
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
22.12.2012, 17:13  [ТС]
Пробую сделать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class field;
class snake
{
...
public:
 
    int GetFieldX(field *f){ return f->FIELD_WIDTH_X; };
...
};
 
class field
{
private:
    int FIELD_START;
    int FIELD_WIDTH_X;
    int FIELD_WIDTH_Y;
 
public: 
    friend int snake::GetFieldX(field *f);
};
выдает ошибку:

error C2027: использование неопределенного типа "field"

я вроде и предобъявление сделал
Что ж я делаю не так
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 17:16
C++
1
#define private public
1
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
22.12.2012, 17:20  [ТС]
Все равно та же самая ошибка
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
22.12.2012, 17:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class field;
class snake
{
public: 
    int GetFieldX(field *f);
};
 
class field
{
private:
    int FIELD_START;
    int FIELD_WIDTH_X;
    int FIELD_WIDTH_Y;
 
public: 
    friend snake;
}; 
int snake::GetFieldX(field *f){ return f->FIELD_WIDTH_X; }
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
22.12.2012, 17:30
Боюсь, такую круговую поруку не выразить. Делайте другом класса field весь класс snake. И вычтите себе двадцать очков из кармы, потому что friend вне библиотечного кода (читай: в прикладном коде) = вы что-то делаете не так.
0
8 / 8 / 4
Регистрация: 21.12.2012
Сообщений: 121
22.12.2012, 17:31  [ТС]
Всем спасибо разобрался, а вообще думал что нет разницы где описывать функцию в самом классе, или за пределами с использованием ::
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
22.12.2012, 17:35
Цитата Сообщение от anklbenz Посмотреть сообщение
а вообще думал что нет разницы где описывать функцию в самом классе, или за пределами с использованием
Тогда почитайте о сильно связанных классах, о раздельной компиляции и т.д.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
22.12.2012, 19:30
Цитата Сообщение от Croessmah Посмотреть сообщение
Тогда почитайте о сильно связанных классах, о раздельной компиляции и т.д.
Для начала автору темы неплохо о структурах почитать.
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
22.12.2012, 19:36
Используйте адрессацию и разадресацию.
Создайте функцию которая возвращает указатель на переменную.
например
int *GetFILEDSTART(){return &FILED_START;}
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
22.12.2012, 20:32
Цитата Сообщение от Gus Посмотреть сообщение
Используйте адрессацию и разадресацию.
каким образом это относится к дружественным классам ?
Цитата Сообщение от yekka Посмотреть сообщение
#define private public
и что мы здесь получили все частные становится общими?
зачем тогда эта вся дележка?
Croessmah, все правильно написал класс друг должен быть public:
Цитата Сообщение от Croessmah Посмотреть сообщение
public:
* * friend snake;
а перед этим неплохо бы описать класс (или хотя бы объявить)

Добавлено через 45 секунд
Цитата Сообщение от Gus Посмотреть сообщение
Используйте адрессацию и разадресацию.
Создайте функцию которая возвращает указатель на переменную.
например
int *GetFILEDSTART(){return &FILED_START;}
и что это даст доступ к частным членам?
0
 Аватар для Gus
26 / 37 / 10
Регистрация: 17.02.2009
Сообщений: 364
22.12.2012, 20:36
Цитата Сообщение от ValeryS Посмотреть сообщение
каким образом это относится к дружественным классам ?

и что мы здесь получили все частные становится общими?
зачем тогда эта вся дележка?
Croessmah, все правильно написал класс друг должен быть public:

а перед этим неплохо бы описать класс (или хотя бы объявить)

Добавлено через 45 секунд

и что это даст доступ к частным членам?
Так вы получаете адресс переменной в памяти, и можете ею манипулировать как угодно.
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
22.12.2012, 20:49
Цитата Сообщение от ValeryS Посмотреть сообщение
класс друг должен быть public
Разве спецификаторы private/public каким-то образом влияют на объявление друзей?

А вот ключевое слово class вроде бы надо указывать:
C++
1
friend class snake;
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
22.12.2012, 21:12
Цитата Сообщение от Gus Посмотреть сообщение
Так вы получаете адресс переменной в памяти,
покаж
как я могу получить адрес приватной переменной( а точнее члена класса)?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
23.12.2012, 03:18
Цитата Сообщение от yekka Посмотреть сообщение
C++
1
#define private public
А мне понравилось. Продолжу:
C++
1
#define cin cout
Это кратко и гениально. А вот длинная шутка про змею.
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
#include <iostream>
using namespace std;
//два класса связаны указателями друг на друга
//связанные классы объявим в одном файле (это может быть отдельный хэдер)
class snake;//предварительное объявление для указателя snake* sn
class field
{
private:
    int FIELD_START;
    int FIELD_WIDTH_X;
    int FIELD_WIDTH_Y;
    snake* sn;
public:
field(int _FIELD_START=0, int _FIELD_WIDTH_X=0, int _FIELD_WIDTH_Y=0);
int getSt();
int get_X();
int get_Y();
void setSN(snake* _sn);
snake* getSN();
};
field::field(int _FIELD_START, int _FIELD_WIDTH_X, int _FIELD_WIDTH_Y){
FIELD_START=_FIELD_START;
FIELD_WIDTH_X=_FIELD_WIDTH_X;
FIELD_WIDTH_Y=_FIELD_WIDTH_Y;
}//этот конструктор не инициализирует sn! Потому, что её в коде ещё не будет когда он вызовется
int field::getSt(){return FIELD_START;}
int field::get_X(){return FIELD_WIDTH_X;}
int field::get_Y(){return FIELD_WIDTH_Y;}
snake* field::getSN(){return sn;}
void field::setSN(snake* _sn){sn=_sn;}//когда змея появится её можно будет отловить и закончить инициализацию
//до этого к полю sn обращаться не стоит
 
class snake
{
private:
field* ptrFld;
int numb;
public:
snake(field* _ptrFld, int _numb);
int get();
void SnakeRun();
};
snake::snake(field* _ptrFld, int _numb){
ptrFld=_ptrFld;
numb=_numb;
}
int snake::get(){return numb;}
void snake:: SnakeRun(){
cout<<"FIELD_START =\t"<<ptrFld->getSt()<<endl;
cout<<"FIELD_WIDTH_X =\t"<<ptrFld->get_X()<<endl;
cout<<"FIELD_WIDTH_Y =\t"<<ptrFld->get_Y()<<endl;
}
 
int main(){
//setlocale(0, "rus");
field* varPosition= new field(1,2,3);
snake concretnayaZmeya(varPosition,1);//полностью инициализированная змея)
varPosition->setSN(&concretnayaZmeya);//поймали змею!
concretnayaZmeya.SnakeRun();
cout<<varPosition->getSN()->get();//обратились косвенно через позицию к конкретной змее
cout <<endl;
system ("pause");
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2012, 03:18
Помогаю со студенческими работами здесь

С помощью делегата из одного класса вызвать private метод с другого класса
доброго времени суток. такой вопрос. С применением делегатов и пониманием проблем нет когда происходит простой вызов из Main() функции. Но...

Получить переменную из другого класса
Помогите разобраться, как можно получить переменную которая объявлена в другом классе как public? Есть некая переменная &quot;x&quot;,...

Можно ли как-то получить из одного класса исходный код другого класса?
Предположим есть два публичных класса. Один находится в одной части проекта, другой где-нибудь в другой части проекта. Мне для своих...

Не могу получить переменную из другого класса
Здравствуйте. Учу ООП. Создаю сайт. В каждом экшене сайта есть переменная public $page_title; которой на программном уровне я присваиваю...

Не видит переменную внутри класса из другого класса
Созданы 2 класса внутри одного, 2-ой класс EHandler не видит переменные из GuiClass в чем может быть проблема?:( package kz.home.gui; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru