メンバー関数ポインタ
1792 ワード
//出典は『コードを楽しむ』コース.
知るべきところ
コールバック関数を使用するときに静的関数として使用する場合は、静的内部
クラス内の仮想関数とメンバーにアクセスできません. threadを作成すると、パラメータにスケールしてアクセスします.
講義の参考. メンバーデータポインタ
上で作成したメンバー関数ポインタを使用します.
ただし、オブジェクトではないため、アドレス値を表します.
#include <iostream>
using namespace std;
class CPoint
{
private :
int x_;
public :
//static 함수는 클래스의 멤버 변수에 접근할 수 없다.
//내부적으로 this 포인터를 인자로 콜하는 것이 아니기 때문.
static void hello(int _num)
{
//밑의 주석 지우면 오류 발생함.
//x_ = _num;
}
};
class Dialog
{
public :
void Close() {}
static void Open() {}
};
void foo() {}
int main(void)
{
//함수 포인터를 지정할 때
//동일한 반환형, 동일한 매개변수를 사용해서 함수를 지정하게 함.
void(*func)() = &foo;
//하지만 이처럼 클래스 내부를 할 수 없다.
//왜냐하면 객체화를 하지 않았으므로
void(*func2)() = &Dialog::Close;
//=> 여기서 알 수 있는 점 :
//1번 : 일반함수 포인터에 멤버 함수의 주소를 담을 수 없음.
//왜냐하면 멤버함수에는 this가 포함되어 있기 때문임
//2번 : 일반 함수 포인터에 static 멤버함수의 주소를 담을 수 있음.
//클래스 내부더라도 어쨋든 this의 속성으로 접근하지 않기 때문.
void(*func3)() = &Dialog::Open;
//3번 : 멤버의 함수를 설정하는 멤버함수 포인터가 있음.
//멤버 함수 포인터를 사용하는 방법 : .* (p->*f3)()
void(Dialog::*func4)() = &Dialog::Close;
//그렇다면 멤버 함수 포인터를 call 할 수 있음?
func4();
//=> 불가능하다... 왜냐하면 클래스의 멤버함수를 호출하기 위해서는 객체화 즉, this가 필요하기 때문
//그렇다면 어찌할 것인가?
//객체화 해서 호출해야 함.
Dialog d;
d.func4(); //but, 클래스 Dialog 에서는 멤버함수 func4를 찾을 수 없음
//c++에서는 멤버함수 포인터를 call 하기 위해 새로운 문법을 만듬.
d.*func4(); // error : 연산자 우선순위 문제가 있음.
(d.*func4)(); // 이런식으로 사용함.
}
知るべきところ
コールバック関数を使用するときに静的関数として使用する場合は、静的内部
クラス内の仮想関数とメンバーにアクセスできません.
講義の参考.
上で作成したメンバー関数ポインタを使用します.
ただし、オブジェクトではないため、アドレス値を表します.
Reference
この問題について(メンバー関数ポインタ), 我々は、より多くの情報をここで見つけました https://velog.io/@kwt0124/멤버-함수-포인터テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol