Хак ли?
От: _defrager Россия  
Дата: 21.09.04 12:22
Оценка:
Нужно добраться до private member класса. VC5/6/7/7.1/8 позволяет сделать



class ClassWithPrivateMember
{
protected:
    int m_a;
};

class ClassNeedModifyPrivateMember
{
public:
    void Modify(ClassWithPrivateMember* a)
    {
        class Friend : public ClassWithPrivateMember
        {
            friend ClassNeedModifyPrivateMember;
        };

        ((Friend*)a)->m_a = 5;

        
    }
};


int main(int argc, char* argv[])
{
    ClassWithPrivateMember a;
    ClassNeedModifyPrivateMember b;

    b.Modify(&a);

    return 0;
}



Intel C compiler вроде как жалуется.
Насколько "законно" так делать?
Re: Хак ли?
От: Аноним  
Дата: 21.09.04 12:41
Оценка: :)
Так класс Friend у тебя не содержит никаких членов m_a, как же у тебя вообще что-то работает?
Re: Хак ли?
От: Bell Россия  
Дата: 21.09.04 13:06
Оценка:
Здравствуйте, _defrager, Вы писали:

m_a — не член класса Friend, а посему ClassNeedModifyPrivateMember не может получить к нему доступ.
Можно было бы попробовать вот так:

class ClassNeedModifyPrivateMember
{
public:
    void Modify(ClassWithPrivateMember* a)
    {
        class Friend : public ClassWithPrivateMember
        {
        public:
            void modify_a(int n) { m_a = n;}
        };

        static_cast<Friend*>(a)->modify_a(5);//***
    }
};

, и такой код даже работает на некоторых реализациях, но в общем случае, результат преобразования ***, согласно 5.2.9/8, неопределен.
Любите книгу — источник знаний (с) М.Горький
Re: Хак ли?
От: Анатолий Широков СССР  
Дата: 21.09.04 14:19
Оценка:
_>Нужно добраться до private member класса. VC5/6/7/7.1/8 позволяет сделать
_>Насколько "законно" так делать?

http://www.rsdn.ru/Forum/Message.aspx?mid=526498&amp;only=1
Автор: Tom
Дата: 02.02.04
Re[2]: Хак ли?
От: _defrager Россия  
Дата: 21.09.04 17:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Так класс Friend у тебя не содержит никаких членов m_a, как же у тебя вообще что-то работает?


Он унаследован от ClassWithPrivateMember.
Re[2]: Хак ли?
От: _Winnie Россия C++.freerun
Дата: 21.09.04 21:28
Оценка: -1
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, _defrager, Вы писали:

B>Можно было бы попробовать вот так:


B>
B>        static_cast<Friend*>(a)->modify_a(5);//***
B>

B>, и такой код даже работает на некоторых реализациях, но в общем случае, результат преобразования ***, согласно 5.2.9/8, неопределен.


#include <iostream>

class ClassWithPrivateMember
{
protected:
    int m_a;
};

struct GetProtected: public ClassWithPrivateMember
{  
  ClassWithPrivateMember &ref;
  GetProtected(ClassWithPrivateMember &ref): ref(ref) {}
  int &Get() { return this->m_a; }
};

int main()
{
  ClassWithPrivateMember old_fat_lady;

  GetProtected(old_fat_lady).Get() = 10;
}



И никаких spiteful_violator_cast<>().
А можно просто там статическую фунцию завести, так даже проще, наверное.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: Хак ли?
От: _defrager Россия  
Дата: 22.09.04 04:29
Оценка: +1
Здравствуйте, _Winnie, Вы писали:



_W>
_W>#include <iostream>

_W>class ClassWithPrivateMember
_W>{
_W>protected:
_W>    int m_a;
_W>};

_W>struct GetProtected: public ClassWithPrivateMember
_W>{  
_W>  ClassWithPrivateMember &ref;
_W>  GetProtected(ClassWithPrivateMember &ref): ref(ref) {}
_W>  int &Get() { return this->m_a; }
_W>};

_W>int main()
_W>{
_W>  ClassWithPrivateMember old_fat_lady;

_W>  GetProtected(old_fat_lady).Get() = 10;
_W>}
_W>



_W>И никаких spiteful_violator_cast<>().

_W>А можно просто там статическую фунцию завести, так даже проще, наверное.


Это ты меня дуришь.
У GetProtected получилось 2 версии m_a : унаследованная и от ref. Ты в int &Get() возвращаешь унаследованную.
Вот если бы было
int &Get() { return ref.m_a; }
но оно опять не пройдет по известной ошибке.
Re: Хак ли?
От: alexkro  
Дата: 22.09.04 06:13
Оценка: 28 (5)
Здравствуйте, _defrager, Вы писали:

_>Нужно добраться до private member класса. VC5/6/7/7.1/8 позволяет сделать

...

Если уж хочется получить доступ к закрытым членам в абсолютном соответствии со стандартом, то вот один метод:
class ClassWithPrivateMember
{
public:
    template < typename T >
    void foo( T & )
    {
        // do something innocent
    }
    
private:
    int m_a;
};


// in another translation unit

namespace
{
    class Y {};
}

template <> void ClassWithPrivateMember::foo( Y & )
{
    ++m_a;  // do whatever you want with private m_a
}

int main()
{
    ClassWithPrivateMember a;
    Y y;
    a.foo( y );
}

За объяснениями к Саттеру: http://www.gotw.ca/gotw/076.htm
Re[2]: Хак ли?
От: Вадим Никулин Россия Здесь
Дата: 22.09.04 06:29
Оценка:
Здравствуйте, alexkro, Вы писали:

A>Если уж хочется получить доступ к закрытым членам в абсолютном соответствии со стандартом, то вот один метод:


A>За объяснениями к Саттеру: http://www.gotw.ca/gotw/076.htm


Интересно. Это я пропустил, пока Саттера читал (русское издание
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
), или это туда не вошло?
Re[3]: Хак ли?
От: alexkro  
Дата: 22.09.04 06:33
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>Здравствуйте, alexkro, Вы писали:


A>>Если уж хочется получить доступ к закрытым членам в абсолютном соответствии со стандартом, то вот один метод:


A>>За объяснениями к Саттеру: http://www.gotw.ca/gotw/076.htm


ВН>Интересно. Это я пропустил, пока Саттера читал (русское издание
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
), или это туда не вошло?


Не вошло. Это в новой книге "Exceptional C++ Style".
Re[4]: Хак ли?
От: Вадим Никулин Россия Здесь
Дата: 22.09.04 06:47
Оценка:
Здравствуйте, alexkro, Вы писали:

A>>>За объяснениями к Саттеру: http://www.gotw.ca/gotw/076.htm


ВН>>Интересно. Это я пропустил, пока Саттера читал (русское издание
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
), или это туда не вошло?


A>Не вошло. Это в новой книге "Exceptional C++ Style".


Это, как я понимаю, Саттер-Александреску? Она уже вышла?
Re[5]: Хак ли?
От: alexkro  
Дата: 22.09.04 06:55
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>Здравствуйте, alexkro, Вы писали:


A>>>>За объяснениями к Саттеру: http://www.gotw.ca/gotw/076.htm


ВН>>>Интересно. Это я пропустил, пока Саттера читал (русское издание
Автор(ы): Герб Саттер

В данном издании объединены две широко известные профессионалам в области
программирования на C++ книги Герба Саттера Exceptional C++
и More Exceptional C++, входящие в серию книг C++ In-Depth,
редактором которой является Бьерн Страуструп, создатель языка C++.
Материал этой книги составляют переработанные задачи серии Guru of the Week,
рассчитанные на читателя с достаточно глубоким знанием C++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
), или это туда не вошло?


A>>Не вошло. Это в новой книге "Exceptional C++ Style".


ВН>Это, как я понимаю, Саттер-Александреску? Она уже вышла?


Нет, это другая книга. Sutter, "Exceptional C++ Style". Sutter + Alexandrescu, "C++ Coding Standards" еще не вышла.
Re[3]: Хак ли?
От: Аноним  
Дата: 22.09.04 08:05
Оценка:
_>Он унаследован от ClassWithPrivateMember.

Хаха! Точно, не разглядел просто
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.