У меня есть архитектура GUI, в которой элементы запускают события, например, так:
guiManager->fireEvent(BUTTON_CLICKED, this);
Каждое отдельное событие передает «this» как вызывающее событие. Никогда не бывает времени, когда я не хочу передать 'this', и, кроме того, указатель , кроме для слова "this", никогда не должен передаваться.
Это подводит меня к проблеме: как я могу утверждать, что fireEvent никогда не дается указатель, отличный от 'this', и как я могу упростить (и гомогенизировать) вызовы fireEvent до:
guiManager->fireEvent(BUTTON_CLICKED);
В этот момент мне вспоминается довольно распространенная ошибка компилятора, когда вы пишете что-то вроде этого:
class A {
public:
void foo() {}
};
class B {
void oops() { const A* a = new A; a->foo(); }
};
int main() {
return 0;
}
Компиляция этого даст вам
В функции-члене
Oid void B :: oops () ’:
ошибка: прохождение
«Const A» как «this» аргумент «void»
A :: foo () ’отбрасывает квалификаторы
потому что функции-члены передают 'this' в качестве скрытого параметра.
"Ага!" Я говорю. Это (без каламбура) именно то, что я хочу. Если бы я мог как-то получить доступ к скрытому указателю «this», это решило бы обе проблемы, о которых я упоминал ранее. Проблема в том, насколько я знаю, что вы не можете (не так ли?), И если бы вы могли, были бы крики "но это нарушит инкапсуляцию!" За исключением того, что я уже пропускаю «это» каждый раз, так что еще может сломаться.
Итак, - это есть ли способ получить доступ к скрытому «этому», и если нет, то есть ли какие-то идиомы или альтернативные подходы, которые более элегантны, чем каждый раз передавать «это»?