Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
#1

Как получить доступ к массиву из другого класса? - C++

19.04.2013, 11:05. Просмотров 941. Ответов 15
Метки нет (Все метки)

Подскажите, есть такой код:

C++
1
2
3
switch(o_field.fieldArray[o_player.getPlayerPositionX()][o_player.getPlayerPositionY()]) {
    // Код  
}
Этот код находится в классе А, а массив fieldArray определен в классе В. Для индексов
массива я могу получить доступ через геттеры, а вот само имя массива подчеркивает
красным, пишет, что B::fieldArray недоступно. Как получить к нему доступ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 11:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить доступ к массиву из другого класса? (C++):

Классы С++, получить доступ из одного класса к элементам другого - C++
Здравствуйте! Объясните пожалуйста, вот имеется у меня два класса,например вот такие: Class A { private: int i; }

Как получить private переменную класса, функцей членом другого класса - C++
Игра змейка: Есть класс поле в котором содержится размеры поля: class field { private: int FIELD_START; int...

Как получить доступ к методам класса, который содержится в векторе класса - C++
Пишу дерево с любым количеством наследников. В классе Thread содержится вектор классов Thread. При попытке просмотра первого элемента в...

Как получить доступ к именам пространства имен из другого файла - C++
Помогите мне разобраться: Если определено пространство имен в одном cpp файле, как использовать одно из имен в другом cpp. Пробую что-то...

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

Как получить доступ к членам класса из функций - C++
Есть код типа //***************************************************************************** func1() { body; } func2() ...

15
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 11:26 #2
Цитата Сообщение от dimkaok Посмотреть сообщение
o_field.fieldArray[o_player.getPlayerPositionX()][o_player.getPlayerPositionY()]
сделай в классе В метод, который возвращает значение массива
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
19.04.2013, 11:30  [ТС] #3
Ага, понятно. А вот еще вопрос, если есть перечисление, как к его элементам
получить доступ из другого класса?

C++
1
2
3
4
5
6
7
private:
  enum thingsOnTheField {thingsOnTheField_FOOD,
                   thingsOnTheField_ENEMY,
                   thingsOnTheField_WEAPON,
                   thingsOnTheField_HOME,
                   thingsOnTheField_NOTHING,
                   lengthOfEnum};
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 11:31 #4
никак, так как оно(перечисление) приватное
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
19.04.2013, 11:36  [ТС] #5
Цитата Сообщение от Jupiter Посмотреть сообщение
никак, так как оно(перечисление) приватное
То есть его нужно сделать protected и через наследование, либо сделать public?
И больше никак? Может, методы доступа для enum пишутся?

Добавлено через 2 минуты
А если определить константу в классе как public - это нормально?
Их-же все-равно нельзя изменять
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 11:43 #6
Цитата Сообщение от dimkaok Посмотреть сообщение
То есть его нужно сделать protected и через наследование
это изврат
Цитата Сообщение от dimkaok Посмотреть сообщение
сделать public?
скорее всего это будет лучший вариант
Цитата Сообщение от dimkaok Посмотреть сообщение
И больше никак?
класс в котором нужно использовать перечисления перечисления можно объявить френдом в классе в котором эти перечисления объявлены
1
dimkaok
1 / 1 / 0
Регистрация: 06.03.2013
Сообщений: 128
19.04.2013, 11:47  [ТС] #7
Цитата Сообщение от Jupiter Посмотреть сообщение
То есть его нужно сделать protected и через наследование
это изврат
Слава Богу, а то я не сильно хочу так делать

А вообще нормально-ли определять константы в public?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 11:52 #8
Цитата Сообщение от dimkaok Посмотреть сообщение
А вообще нормально-ли определять константы в public?
если константа статическая то нормально, если у каждого объекта свое значение константы то лучше определить метод который возвращает значение константы
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.04.2013, 12:03 #9
Цитата Сообщение от Jupiter Посмотреть сообщение
это изврат
Почему? Это же enum. Что плохого, если он должен быть виден наследникам и не виден снаружи?

Цитата Сообщение от Jupiter Посмотреть сообщение
если константа статическая то нормально, если у каждого объекта свое значение константы то лучше определить метод который возвращает значение константы
Не могли бы пояснить, чем лучше?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 12:34 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему? Это же enum. Что плохого, если он должен быть виден наследникам и не виден снаружи?
если цель создания наследника только получение доступа к enum то изврат
наследование надо применять только тогда когда оно действительно нужно.

Цитата Сообщение от Tulosba Посмотреть сообщение
Не могли бы пояснить, чем лучше?
для защиты от const_cast, для запрета взятия адреса ну и для солидарности с не константами
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.04.2013, 12:43 #11
Цитата Сообщение от Jupiter Посмотреть сообщение
если цель создания наследника только получение доступа к enum то изврат
Если так, то да. Как раз подумал об этом после сабмита сообщения
Цитата Сообщение от Jupiter Посмотреть сообщение
для защиты от const_cast
Ошибка доступа же будет в рантайме.
И не понятно почему static Вы выделили особняком.
Ещё хотелось бы заметить про БОЛЬШИЕ константные объекты. Копировать при возврате - не гуд, а возвращать константную ссылку, так это тоже самое, что и сам объект открыть (за исключением возможности дополнительных действий при доступе).
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 12:59 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Ошибка доступа же будет в рантайме.
а подробнее?

Цитата Сообщение от Tulosba Посмотреть сообщение
И не понятно почему static Вы выделили особняком.
Ещё хотелось бы заметить про БОЛЬШИЕ константные объекты. Копировать при возврате - не гуд, а возвращать константную ссылку, так это тоже самое, что и сам объект открыть (за исключением возможности дополнительных действий при доступе).
да потому что static не принадлежит объекту
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.04.2013, 13:02 #13
Цитата Сообщение от Jupiter Посмотреть сообщение
а подробнее?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
struct A
{
    static const int i;
};
 
const int A::i = 42;
 
int main()
{
    cout << A::i << endl;
 
    int* v = const_cast<int*>( &A::i );
 
    *v = 24;
 
    cout << A::i << endl;
}
Ловлю Access Violation в VS2010 при попытке присваивания.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 13:04 #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Ловлю Access Violation в VS2010 при попытке присваивания.
аналогично и на gcc, но я то говорил о константах объекта, а не класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo
{
public:
  const int mConst;
  Foo() : mConst(100) { }
};
 
#include <iostream>
 
int main()
{
    Foo f;
    const_cast<int&>(f.mConst) = 500;
    std::cout << f.mConst; //500
}
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.04.2013, 13:44 #15
Цитата Сообщение от Jupiter Посмотреть сообщение
но я то говорил о константах объекта, а не класса
а чем нам поможет геттер в таком случае, если он возвращает не копию, конечно?
0
19.04.2013, 13:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 13:44
Привет! Вот еще темы с ответами:

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

Как получить доступ к элементам формы из созданного класса? - C++
Всем доброго времени суток!:help: Скажите, пожалуйста, как мне обратиться к элементу формы(например TextBox1) извне, то есть из...

Как получить доступ к данным класса, которые являются элементом вектора? - C++
ситуация такая, есть собственноручно написанный Vector есть класс &quot;Person&quot;, с данными (имя, фамилия, возраст) там несколько человек,...

Доступ к функции-члену другого класса - C++
Каким образом можно получить доступ из одного класса к функции члену другого класса???


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

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

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