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

Обращение к закрытому полю - C++

Восстановить пароль Регистрация
 
ByAdD
20 / 3 / 0
Регистрация: 08.05.2011
Сообщений: 195
16.05.2012, 15:30     Обращение к закрытому полю #1
Имееться некий Основной класс с закрытыми полями
C++
1
2
3
4
class C {
    private:   string Name;
       int Nomer;
};
И имееться второй класс который имеет сывои поля и наследует поля класса С
C++
1
2
3
class N : private C{
      int seria;
        };
Как обратиться к полям класса N, к своим и тем что унаследованны из основной программы ?
C++
1
2
3
4
int main 
{
?
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2012, 15:30     Обращение к закрытому полю
Посмотрите здесь:

Обращение к полю элемента std::vector'a C++
C++ Сортировка структур по полю
C++ обращение к приватному полю класса
C++ Сортировка по любому полю
C++ Сортировка структуры по полю
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.05.2012, 15:32     Обращение к закрытому полю #2
ByAdD, Напрямую никак. Только если написать функции, которые возвращают нужные значения.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.05.2012, 16:00     Обращение к закрытому полю #3
Если в С есть публичная шаблонная функция, то можно этот класс "взломать".

Например
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
#include <iostream>
 
class C
{
private:
    int a, b;
    
public:
    C() : a(1), b(2) {}
    
    template < class T >
    void foo(const T& t)
    {
        //...
    }
};
 
namespace
{
    struct temp {};
}
 
int A, B;
 
template <>
void C::foo< temp > (const temp& t) 
{
    A = this->a;
    B = this->b;
}
 
int main()
{
    C c;
    c.foo( temp() );
    
    std::cout << A << ' ' << B << std::endl;
}
Результат: http://liveworkspace.org/code/3b4fa7...13a8dae3681e81
Правда, так делать нехорошо, да и реализовать покрасивее можно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
16.05.2012, 16:00     Обращение к закрытому полю #4
diagon, Интересно. Можно пример? Не совсем понял о чем вы говорите. Знаю, что ломануть можно так.
Понято.

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
#include <iostream>
 
class Cl
{
public:
   Cl():value(0), value2(0)
   {
   }
   int get_first() const { return value; }
   int get_second() const { return value2; }
private:
   int value;
   int value2;
};
 
int main()
{
   Cl c;
   std::cout << *(int*)&c << " " << *((int*)&c + 1) << std::endl;
   *(int*)&c = 1;
   *((int*)&c + 1) = 2;
   std::cout << *(int*)&c << " " << *((int*)&c + 1) << std::endl;
   std::cout << c.get_first() << " " << c.get_second() << std::endl;
}
http://liveworkspace.org/code/2fd673...29c321fe7bb0fd
ByAdD
20 / 3 / 0
Регистрация: 08.05.2011
Сообщений: 195
16.05.2012, 16:09  [ТС]     Обращение к закрытому полю #5
ForEveR а как через функцию можно обратиться тогда?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,410
16.05.2012, 16:09     Обращение к закрытому полю #6
Для доступа к собственным полям можно либо делать данные public (по умолчанию они стоят private), но спрашивается, зачем тогда придумана инкапсуляция. А вобще, полям просто нужно прописать методы для работы с ними. Например вот так:
C++
1
2
3
4
5
6
7
class N : private C
{
    int seria;
    public:
       int getSeria() {return seria; } 
       void setSeria(int x) {seria = x; }
};
Для доступа к элементам базового класса можно: опять же, объявить свойства типа public, либо описать методы и сделать наследование типа public, либо написать в производном классе свои методы, которые вызывали бы методы базового класса (при private-наследовании, все члены (в т.ч. и функции-члены) класса в производном имеют спецификатор private. С private членами работают только методы этого же класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class C {
    private:   std::string Name;
       int Nomer;
      public:
       int getNomer() {return Nomer; } 
       void setNomer(int x) {Nomer = x; } 
};
 
class N : private C
{
    int seria;
    public:
       int getSeria() {return getNomer(); } 
       void setSeria(int x) {setNomer(x); }
        };
       
int main()  
{
    N n;
    n.setSeria(5);
    std::cout<< n.getSeria(); 
    return 0;
}
А вот насчет взлома - не слышал)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2012, 16:12     Обращение к закрытому полю
Еще ссылки по теме:

C++ Не хватает прав доступа к закрытому члену класса из дружественной функции
Доступ к закрытому полю C++
C++ Определение класса leverage и метода для доступа к закрытому полю

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

Или воспользуйтесь поиском по форуму:
ByAdD
20 / 3 / 0
Регистрация: 08.05.2011
Сообщений: 195
16.05.2012, 16:12  [ТС]     Обращение к закрытому полю #7
MrGluck спс , вроде то что нужно , шас опробую
Yandex
Объявления
16.05.2012, 16:12     Обращение к закрытому полю
Ответ Создать тему
Опции темы

Текущее время: 13:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru