Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Приватный расприватить


Автор: Neitron 11.5.2006, 15:27
Подскажите, возможно ли приватный член класс, расприватить для одной единсвенной функции, не используя друзей и наследования? 

Автор: Earnest 11.5.2006, 15:48
Нельзя. Причем наследование тебе "расприватить" не поможет. Вот "распротектить" - это запросто  smile.
Кстати, раз возникла такая надобность, встает вопрос о дизайне: все ли там хорошо? Все же приватные члены - дело интимное. Или это не твой класс? Тогда расприватить тебе вообще ничто не поможет... 

Автор: Neitron 11.5.2006, 16:11
Класс VCL эти.... засунули OnMouseMove в приват.
Расприватить то я могу в наглую.... но не хочется лесть в чужой код....
Ладно. всё. 

Автор: MAKCim 11.5.2006, 16:40
Цитата

Вот "распротектить" - это запросто

причем если наследование разрешено и конструктор не приватный  smile  

Автор: cozzzy 11.5.2006, 16:42
Код

#define private public
 

Автор: MAKCim 11.5.2006, 16:43
Цитата

Код

#define private public


 smile  

Автор: bsa 11.5.2006, 16:47
Цитата(Neitron @ 11.5.2006,  16:11)
Класс VCL эти.... засунули OnMouseMove в приват.
Расприватить то я могу в наглую.... но не хочется лесть в чужой код....
Ладно. всё.

Есть у меня подозрение, что это было сделано специально (допустим, используется для внутренних целей). 

Автор: threef 11.5.2006, 16:54
Перехвати мышА раньше обработчика класса 

Автор: Earnest 11.5.2006, 17:53
Цитата(MAKCim @  11.5.2006,  17:40 Найти цитируемый пост)
причем если наследование разрешено и конструктор не приватный  

Ага, написать protected члены в классе, от которого запрещено наследоваться, это высший C++ пилотаж  smile  

Цитата(Neitron @  11.5.2006,  17:11 Найти цитируемый пост)
Класс VCL эти.... засунули OnMouseMove в приват.
Расприватить то я могу в наглую.... но не хочется лесть в чужой код....

Правильно, что не хочешь... библиотеки перекомпилировать придется...
Я совсем не знаю VCL (когда-то видела, но забыла как страшный сон), но могу предполжить несколько вариантов: 1) если этот метод private - его можно переопределить, причем сделать хоть protected, хоть public, только вызвать базовый метод не удастся 2) если не private, должен быть какой-то способ подключать свои обработчики, т.е. опять таки, можно его подменить в производном классе... 

Автор: Mayk 12.5.2006, 19:28
См. Саттера.

Да, если класс имеет шаблонные функции. Шаблонные ф-ции имеют полный доступ к private переменным класса.

Код

#include <stdio.h>

class NotSoPrivate
{
    int privateVariable;
    public:
    NotSoPrivate(){privateVariable = 144;}
    template<class T>    void doSomething(T arg){}
};


struct YetAnotherClass{
    YetAnotherClass(int* ptr) : deprivatedVariable(ptr){}
    int* deprivatedVariable;
};
template<>
void NotSoPrivate::doSomething(YetAnotherClass arg)
{
    (*arg.deprivatedVariable) = privateVariable; //<<<
}

int main()
{
    int deprivatedVariable;
    YetAnotherClass yac(&deprivatedVariable);
    NotSoPrivate nsp;
    nsp.doSomething(yac);
    printf("%d\n",deprivatedVariable);
}


 

Автор: Earnest 12.5.2006, 19:32
Точно Mayk, отличное решение! Только вот вряд ли там есть подходящие функции...  

Автор: MAKCim 12.5.2006, 22:11
Цитата

Только вот вряд ли там есть подходящие функции...   

если уж лезть в чужой код, то самое то, хоть остальная логика не нарушится  smile  

Автор: Vyacheslav 15.5.2006, 12:21
Что не то. 
Если это производный класс TControl, то там OnMouseMove - protected
Ну даже, если в Вашем классе свойство private и этот класс все таки производный от TControl, то вскрыть его не представляет проблем.
Код

class TProxyClass : public TControl
{
 //....
 public:
    __property   OnMouseMove;
};

TSomeClass* someClass 
//...
if (TControl* control = dynamic_cast<TSomeClass*>(someClass) )
{
      ((TProxyClass*)control)->OnMouseMove = MouseMove;
}



  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)