2015-07-02 2 views
-3

Я просматривал фрагмент кода, когда натолкнулся на что-то новое. Однако я попытался написать свой собственный код для лучшего понимания.Невозможно понять эту концепцию обработчиков в C++

#include<iostream> 

using namespace std; 

class material 
{ 
public: 
material() 
{ 
    cout<<"material() called"<<endl; 
} 

bool test_func() 
{ 
    cout<<"Hello World"<<endl; 

    return true; 
} 
}; 

class server 
{ 
private: 
material *mat; 

public: 
server() 
{ 
    cout<<"server() called"<<endl; 
} 
material *matrl() 
{ 
    return mat; 
} 
}; 

class Handler 
{ 
public: 
Handler() 
{ 
    cout<<"Handler() called"<<endl; 
} 

server svr; 

bool demo() 
{ 
    bool ret; 
    ret=svr.matrl()->test_func(); 

    return ret; 
} 
}; 

int main() 
{ 
Handler h; 
cout<<"returned by demo():"<<h.demo()<<endl; 

return 0; 
} 

Даже я получаю желаемый результат, а именно:

server() called 
Handler() called 
Hello World 
returned by demo():1 

Но я не могу понять определенную концепцию здесь:

material *matrl() 
{ 
    return mat; 
} 

и вызов functionn

ret=svr.matrl()->test_func(); 

Как это wo rking и какая концепция является концепцией этого? Может кто-нибудь мне помочь?

+0

Есть одна проблема: 'mat' никогда не назначается или не инициализируется. Но для семантики этого кода здесь нет ничего особенного: «сервер», на который можно попросить «материал», с помощью которого вы можете что-то сделать «test_func». –

+0

@ Jean-BaptisteYunès Можете ли вы объяснить из вывода программы, как вызываемый Server() отображается перед вызовом Handler(). Я этого не понял. в соответствии с моим пониманием должен быть вызван первый обработчик(). –

+0

@DigviJayPatil. Все элементы инициализируются перед телом конструктора. Если вы не делаете этого самостоятельно, они инициализируются по умолчанию, что означает вызов конструктора по умолчанию для 'svr'. – chris

ответ

1

Вы можете избежать путаницы, если переписать

material *matrl() 
{ 
    return mat; 
} 

в

material* matrl() 
{ 
    return mat; 
} 

Оба одинаковы. Это функция возвращает указатель на объект типа материала

Теперь

ret=svr.matrl()->test_func(); 

с момента matr1() возвращает указатель на объект, который нужно использовать -> для члена function.Or
*(svr.matr1()).test_func();

Смежные вопросы