멤버 함수 포인터와 배열을 사용하여 멤버 함수를 번호로 지정하고 호출하는 방법
소개(사례)
공개 클래스의 함수에, 번호를 지정하는 것으로 거동을 바꾸고 싶습니다만, 어떻게 쓰면 좋을까요?
코드
#include <iostream>
#include <memory>
// 実務クラスのプライベートメンバー関数を番号で指定して呼び出したい。
// 参考書の通りに書くと、プライベート非staticメンバー関数・・・
using ub4 = unsigned int;
// 外部に公開して利用するクラス
class A {
public: // クラスの外で using を使いたいので public にしている。
class impl; // 実務クラスの宣言
private:
std::unique_ptr<impl> pim;
public:
A();
~A();
public:
void func_call( ub4 fn_num );
};
// メンバー関数ポインタへの型を宣言
using a_fn_ptr_t = void ( A::impl:: * )();
// 実務クラス
class A::impl {
static constexpr ub4 pf_num = 4; // 定数で配列の要素数を指定
static a_fn_ptr_t func_ar[ pf_num ];
public:
impl();
~impl();
public:
void func_call( ub4 fn_num );
private:
void func_00();
void func_01();
void func_02();
void func_03();
};
// 配列にメンバー関数ポインタを入れる
a_fn_ptr_t A::impl::func_ar[] = {
&A::impl::func_00,
&A::impl::func_01,
&A::impl::func_02,
&A::impl::func_03
};
A::A() :
pim ( new impl() )
{}
A::~A()
{}
void A::func_call( ub4 fn_num )
{
pim->func_call( fn_num );
}
A::impl::impl() { printf("A::impl::impl() \n");}
A::impl::~impl() { printf("A::impl::~impl()\n");}
void A::impl::func_call( ub4 fn_num )
{
if( fn_num >= pf_num ) return; // 申し訳程度のチェック
( this->*( func_ar[ fn_num ] ) )(); // 配列に入っているメンバー関数を呼び出し。
}
// 何らかの実務関数
void A::impl::func_00() { printf("A::impl::func_00()\n"); }
void A::impl::func_01() { printf("A::impl::func_01()\n"); }
void A::impl::func_02() { printf("A::impl::func_02()\n"); }
void A::impl::func_03() { printf("A::impl::func_03()\n"); }
// 実際に使えるかテストしてみる。
int main()
{
A a;
a.func_call( 0 );
a.func_call( 1 );
a.func_call( 2 );
a.func_call( 3 );
a.func_call( 4 );
a.func_call( 5 );
a.func_call( 6 );
return 0;
}
결과
Start
A::impl::impl()
A::impl::func_00()
A::impl::func_01()
A::impl::func_02()
A::impl::func_03()
A::impl::~impl()
0
Finish
참조
Wandbox에서 확인하였습니다.
h tp : // 메 l 폰. 오 rg/완 d보 x/페 rm ㎃ k/b 쿠 7 푸 16 우에 tcmJ9
C++11 참고서: 함수 호출(Function call)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#에 xpr. 괄호
C++11 참고서: 멤버에 대한 포인터 연산자(Pointer-to-member operators)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#에 xpr. mptr. 오페
C++11 참고서: 비static 멤버 함수(Nonstatic member functions)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#cぁs. mfct. Non-s c
기타
코드의 색칠이 없으면 전혀 모릅니다.
그건 그렇고, 내 환경windows7 64bit
Microsoft Visual Studio Express 2013 for Windows Desktop
그럼, 다음과 같이 표시시키고 있습니다.
색이 빨갛게 될 만큼 어쩐지 위험한 느낌, 조심하지 않으면 안되는 느낌이 나오도록 하고 있습니다만, 이것은 그중 다른 기사에 쓸까라고 생각합니다.
나중에非staticメンバー関数
라고 하는 기술의 방법은 처음과 똑같네요.
일반인의 나에게 있어서는 普通のメンバー関数
라고 기술하고 싶은 곳입니다.
이상입니다.
뭔가 지적 사항이 있으면, 부담없이 코멘트 부탁드립니다.
Reference
이 문제에 관하여(멤버 함수 포인터와 배열을 사용하여 멤버 함수를 번호로 지정하고 호출하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shiro_naga/items/5967f6cd1710e7b78677
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <iostream>
#include <memory>
// 実務クラスのプライベートメンバー関数を番号で指定して呼び出したい。
// 参考書の通りに書くと、プライベート非staticメンバー関数・・・
using ub4 = unsigned int;
// 外部に公開して利用するクラス
class A {
public: // クラスの外で using を使いたいので public にしている。
class impl; // 実務クラスの宣言
private:
std::unique_ptr<impl> pim;
public:
A();
~A();
public:
void func_call( ub4 fn_num );
};
// メンバー関数ポインタへの型を宣言
using a_fn_ptr_t = void ( A::impl:: * )();
// 実務クラス
class A::impl {
static constexpr ub4 pf_num = 4; // 定数で配列の要素数を指定
static a_fn_ptr_t func_ar[ pf_num ];
public:
impl();
~impl();
public:
void func_call( ub4 fn_num );
private:
void func_00();
void func_01();
void func_02();
void func_03();
};
// 配列にメンバー関数ポインタを入れる
a_fn_ptr_t A::impl::func_ar[] = {
&A::impl::func_00,
&A::impl::func_01,
&A::impl::func_02,
&A::impl::func_03
};
A::A() :
pim ( new impl() )
{}
A::~A()
{}
void A::func_call( ub4 fn_num )
{
pim->func_call( fn_num );
}
A::impl::impl() { printf("A::impl::impl() \n");}
A::impl::~impl() { printf("A::impl::~impl()\n");}
void A::impl::func_call( ub4 fn_num )
{
if( fn_num >= pf_num ) return; // 申し訳程度のチェック
( this->*( func_ar[ fn_num ] ) )(); // 配列に入っているメンバー関数を呼び出し。
}
// 何らかの実務関数
void A::impl::func_00() { printf("A::impl::func_00()\n"); }
void A::impl::func_01() { printf("A::impl::func_01()\n"); }
void A::impl::func_02() { printf("A::impl::func_02()\n"); }
void A::impl::func_03() { printf("A::impl::func_03()\n"); }
// 実際に使えるかテストしてみる。
int main()
{
A a;
a.func_call( 0 );
a.func_call( 1 );
a.func_call( 2 );
a.func_call( 3 );
a.func_call( 4 );
a.func_call( 5 );
a.func_call( 6 );
return 0;
}
결과
Start
A::impl::impl()
A::impl::func_00()
A::impl::func_01()
A::impl::func_02()
A::impl::func_03()
A::impl::~impl()
0
Finish
참조
Wandbox에서 확인하였습니다.
h tp : // 메 l 폰. 오 rg/완 d보 x/페 rm ㎃ k/b 쿠 7 푸 16 우에 tcmJ9
C++11 참고서: 함수 호출(Function call)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#에 xpr. 괄호
C++11 참고서: 멤버에 대한 포인터 연산자(Pointer-to-member operators)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#에 xpr. mptr. 오페
C++11 참고서: 비static 멤버 함수(Nonstatic member functions)
ht tp // // 에조에료. 기주 b. 이오/cp-보오 k/C+++11-Sy 난 x-안 d-후아트레. xtml#cぁs. mfct. Non-s c
기타
코드의 색칠이 없으면 전혀 모릅니다.
그건 그렇고, 내 환경windows7 64bit
Microsoft Visual Studio Express 2013 for Windows Desktop
그럼, 다음과 같이 표시시키고 있습니다.
색이 빨갛게 될 만큼 어쩐지 위험한 느낌, 조심하지 않으면 안되는 느낌이 나오도록 하고 있습니다만, 이것은 그중 다른 기사에 쓸까라고 생각합니다.
나중에非staticメンバー関数
라고 하는 기술의 방법은 처음과 똑같네요.
일반인의 나에게 있어서는 普通のメンバー関数
라고 기술하고 싶은 곳입니다.
이상입니다.
뭔가 지적 사항이 있으면, 부담없이 코멘트 부탁드립니다.
Reference
이 문제에 관하여(멤버 함수 포인터와 배열을 사용하여 멤버 함수를 번호로 지정하고 호출하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shiro_naga/items/5967f6cd1710e7b78677
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
코드의 색칠이 없으면 전혀 모릅니다.
그건 그렇고, 내 환경
windows7 64bit
Microsoft Visual Studio Express 2013 for Windows Desktop
그럼, 다음과 같이 표시시키고 있습니다.색이 빨갛게 될 만큼 어쩐지 위험한 느낌, 조심하지 않으면 안되는 느낌이 나오도록 하고 있습니다만, 이것은 그중 다른 기사에 쓸까라고 생각합니다.
나중에
非staticメンバー関数
라고 하는 기술의 방법은 처음과 똑같네요.일반인의 나에게 있어서는
普通のメンバー関数
라고 기술하고 싶은 곳입니다.이상입니다.
뭔가 지적 사항이 있으면, 부담없이 코멘트 부탁드립니다.
Reference
이 문제에 관하여(멤버 함수 포인터와 배열을 사용하여 멤버 함수를 번호로 지정하고 호출하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shiro_naga/items/5967f6cd1710e7b78677텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)