Нужно добраться до 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 вроде как жалуется.
Насколько "законно" так делать?
Так класс Friend у тебя не содержит никаких членов m_a, как же у тебя вообще что-то работает?
Здравствуйте, _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, неопределен.
Здравствуйте, 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<>().
А можно просто там статическую фунцию завести, так даже проще, наверное.
Здравствуйте, _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; }
но оно опять не пройдет по известной ошибке.
Здравствуйте, _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
Здравствуйте, 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++.
Однако книга будет полезна каждому, кто хочет углубить свои знания в этой
области.
), или это туда не вошло?
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Здравствуйте, 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".
Здравствуйте, 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".
Это, как я понимаю, Саттер-Александреску? Она уже вышла?
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Здравствуйте, 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" еще не вышла.
_>Он унаследован от ClassWithPrivateMember.
Хаха! Точно, не разглядел просто