Другие языки программирования и технологии
C++ как обратиться к элементу находящемуся в privatе? компилятор выдает ошибку
компилятор выдает ошибку error C2248: PRICE::name_market: невозможно обратиться к private член, объявленному в классе "PRICE"
Если PRICE не в твой класс, то никак.
Он для того и помещён в private.
Если же он твой, сделай класс, который должен к нему обращаться другом.
Он для того и помещён в private.
Если же он твой, сделай класс, который должен к нему обращаться другом.
Купи книжку по С++. Любую.
создай в классе функцию, которая возвращает значение элемента. На то он и приват, чтобы кроме как функции класса к нему нельзя было обратиться.
#define private public
Иди-ка для начала выучи хотя бы основы ООП. Идиотские вопросы вроде этого сразу отпадут
Всем предыдущим ответчикам +100500, даж #define private public, что крайне весело) , но.. . если вопрос стоит, всетаки, как получить доступ к private полю некоторого класса, то дам вам свой ответ.. . Скажу сразу, делать такое - БОООЛЬШАЯ ошибка, так как разработчики классов не зря следуют принципам инкапсуляции. НО. . Тем не менее, если все же надо, то доступ получить очень просто, если известен формат объекта. Допустим, в некоторой библиотеке описан класс MyClass, его описание лежит в соответствующем хедере и выглядит так:
class MyClass
{
private:
double x;
int y;
public:
MyClass(double x, int y);
void Show();
};
Соответственно, формат мы знаем.
Реализация методов нам не доступна, и, допустим, выглядит так:
MyClass::MyClass(double x, int y){this->x = x;this->y=y;}
void MyClass::Show(){printf("x=%f\ty=%d\n",this->x,this->y);}
Однако этот момент не имеет значения.
Объект этого класса можно создать вызовом функции CreateInstance, которая выглядит вместе с реализацией так:
MyClass* CreateInstance(double x, int y)
{
MyClass* a = new MyClass(x,y);
return a;
}
Таким образом, main использующий эту функцию может выглядеть так:
void main()
{
MyClass* a = CreateInstance(10,20);
a->Show();
}
У нас есть CreateInstance, создающий объект и возвращающий его адрес, который получаем в указатель a. И вызываем единственный открытый метод Show для распечатки содержимого объекта.
Теперь. Допустим, наша задача - после создания объекта, но до вывода, изменить значение скрытого поля y. Сделать это можно таким образом:
void main()
{
MyClass* a = CreateInstance(10,20);
int* y = (int*)((char*)a+8);
*y = 5;
a->Show();
}
Тут в строке int* y = (int*)((char*)a+8); получаем адрес поля Y - берем адрес обекта, преобразуем его к указателю на char, чтобы при сложении со смещением за шаг принимался один байт (для удобства) и смещаемя на 8 байт от начала (поле Y стоит сразу за полем Xб у которого тип double - 8 байт) , преобразуем полученный адрес к типу "указатель на int" (так как поле Y у нас типа int) и с помощью операции косвенной адресации (*y = 5;) - запихиваем тубя пятерку. В результате, вместо положенного вывова (X=10 Y=20), выводится (X=10 Y=5).
Все...
class MyClass
{
private:
double x;
int y;
public:
MyClass(double x, int y);
void Show();
};
Соответственно, формат мы знаем.
Реализация методов нам не доступна, и, допустим, выглядит так:
MyClass::MyClass(double x, int y){this->x = x;this->y=y;}
void MyClass::Show(){printf("x=%f\ty=%d\n",this->x,this->y);}
Однако этот момент не имеет значения.
Объект этого класса можно создать вызовом функции CreateInstance, которая выглядит вместе с реализацией так:
MyClass* CreateInstance(double x, int y)
{
MyClass* a = new MyClass(x,y);
return a;
}
Таким образом, main использующий эту функцию может выглядеть так:
void main()
{
MyClass* a = CreateInstance(10,20);
a->Show();
}
У нас есть CreateInstance, создающий объект и возвращающий его адрес, который получаем в указатель a. И вызываем единственный открытый метод Show для распечатки содержимого объекта.
Теперь. Допустим, наша задача - после создания объекта, но до вывода, изменить значение скрытого поля y. Сделать это можно таким образом:
void main()
{
MyClass* a = CreateInstance(10,20);
int* y = (int*)((char*)a+8);
*y = 5;
a->Show();
}
Тут в строке int* y = (int*)((char*)a+8); получаем адрес поля Y - берем адрес обекта, преобразуем его к указателю на char, чтобы при сложении со смещением за шаг принимался один байт (для удобства) и смещаемя на 8 байт от начала (поле Y стоит сразу за полем Xб у которого тип double - 8 байт) , преобразуем полученный адрес к типу "указатель на int" (так как поле Y у нас типа int) и с помощью операции косвенной адресации (*y = 5;) - запихиваем тубя пятерку. В результате, вместо положенного вывова (X=10 Y=20), выводится (X=10 Y=5).
Все...
Василий Патрушев
Копаться напрямую в памяти - неспортивно!
Похожие вопросы
- Код c++ выдает ошибку
- 3d max выдаёт ошибку...
- Синий экран смерти выдает ошибку 0х0000008е
- Комп при включении выдаёт ошибку . Что то за ошибка и как её исправить _посмотрите пож_ста скрин .
- C++: Что это значит? Что мне нужно исправить, чтобы не выдавало ошибку?
- Почистил комп от пыли и теперь выдаёт ошибку....
- Почему PASCAL выдает ошибку?
- Как удалить программу, если она находится в прграммы и компаненты и при нажатии удалить выдает ошибку)))
- Комп выдает ошибку. Постоянно. Вот Фото. Че это такое вообще???
- Pascal. Почему выдает ошибку? Помогите отладить
вспомнил еще про
#define true false