Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.91
anklbenz
7 / 7 / 1
Регистрация: 21.12.2012
Сообщений: 68
#1

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

21.12.2012, 19:18. Просмотров 3359. Ответов 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.

не могу никак разобрать как это сделать
Помогите мне.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2012, 19:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить private переменную класса, функцей членом другого класса (C++):

Как сделать членом класса экземпляр этого же класса - C++
class Operation { public: bool type; //true = operation, false = number char Operator; Operation L_Op; Operation R_Op; ...

Как получить доступ в private из дочернего класса? - C++
Привет :) Изучаю наследование. Столкнулся с такой проблемой. Написал класс "Figure" и создал его дочерний класс "Square". ...

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

Как получить доступ к массиву из другого класса? - C++
Подскажите, есть такой код: switch(o_field.fieldArray) { // Код } Этот код находится в классе А, а массив fieldArray...

Приём константных векторов класса, как аргументов в методе другого класса - C++
Есть такой класс: class Order { private: int numberOrder; map <string, int> catalogDish; double totalCost; public: ...

Как переместить из стека одного класса в массив другого класса? - C++
// HW_on.24.11_classStack_SantaClaus.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
22.12.2012, 20:32 #16
Цитата Сообщение от Gus Посмотреть сообщение
Используйте адрессацию и разадресацию.
каким образом это относится к дружественным классам ?
Цитата Сообщение от yekka Посмотреть сообщение
#define private public
и что мы здесь получили все частные становится общими?
зачем тогда эта вся дележка?
Croessmah, все правильно написал класс друг должен быть public:
Цитата Сообщение от Croessmah Посмотреть сообщение
public:
* * friend snake;
а перед этим неплохо бы описать класс (или хотя бы объявить)

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

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

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

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

и что это даст доступ к частным членам?
Так вы получаете адресс переменной в памяти, и можете ею манипулировать как угодно.
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 20:49 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
класс друг должен быть public
Разве спецификаторы private/public каким-то образом влияют на объявление друзей?

А вот ключевое слово class вроде бы надо указывать:
C++
1
friend class snake;
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
22.12.2012, 21:12 #19
Цитата Сообщение от Gus Посмотреть сообщение
Так вы получаете адресс переменной в памяти,
покаж
как я могу получить адрес приватной переменной( а точнее члена класса)?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6455 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,564
Записей в блоге: 4
23.12.2012, 03:18 #20
Цитата Сообщение от 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;
}
Croessmah
Модератор
Эксперт CЭксперт С++
13132 / 7395 / 828
Регистрация: 27.09.2012
Сообщений: 18,217
Записей в блоге: 3
Завершенные тесты: 1
23.12.2012, 08:48 #21
Цитата Сообщение от Gus Посмотреть сообщение
Так вы получаете адресс переменной в памяти, и можете ею манипулировать как угодно.
Тогда смысл делать её приватной, если мы можем получить её адрес? Мне одному кажется, что это идет в разрез с сутью ООП?

Можно сделать отдельную функцию дружественной, а не весь класс.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2012, 08:48
Привет! Вот еще темы с ответами:

Как сделать, чтобы функция класса могла работать с обьектами другого класса - C++
есть класс к примеру class One и класс к примеру class Two нужно чтобы элемент функция класса One могла работать в обьектами класа...

Массив объектов класса как член другого класса - C++
Здравствуйте. У меня тут возникла проблемка #include &quot;main.h&quot; class player { public: player(); player(char*); ...

Как получить hwnd элемента диалога с другого класса? - C++
Как получить hwnd элемента диалога с другого класса? Допустим, сижу в другом классе диалоге и при одном событии сделать недоступной...

Ссылка на переменную другого класса - C++
Всем привет ! Хочу создать ссылку на переменную класса Animation. class PLAYER { public: .... float...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.12.2012, 08:48
Ответ Создать тему
Опции темы

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