C++ ではクラス定義時に private としたメンバには外からはアクセスできない。 そのメンバへの参照やポインタを作って外へ漏らしたりしない限りあくまで内部的なデータである。 (メモリレイアウトを知っていれば無理矢理にアクセスすることは出来なくもないが、それは言語の範囲外の話ということでとりあえず置く。)
そして型についてもまたクラスの private 要素として定義することが出来る。 たとえば
#include <iostream>
class foo {
private:
class bar {};
public:
static bar make_bar(void) {
return bar();
}
static void print_bar(bar) {
std::cout << "bar" << std::endl;
}
};
という定義を作ったときは foo::bar という型を隠したいという意図がある。 foo::bar という型に外からアクセスできないのだから、 foo::bar 型の変数を foo の外で作ることは出来ない。 foo::make_bar が返した値は捨てるか foo::print_bar が受け取る以外の使い方は出来ない。 …… C++03 までは。
C++11 以降では auto や decltype で private な型も使える。
int main(void) {
foo::make_bar(); // OK
foo::print_bar(foo::make_bar()); // OK
foo::bar x = foo::make_bar(); // foo::bar は private なのでエラー
auto x = foo::make_bar(); // C++11 からは auto が使える
decltype(foo::make_bar()) y = foo::make_bar(); // C++11 からは decltype が使える
return 0;
}
このような場合に foo::bar という型を外へ見せない方法というのはあるだろうか?
Document ID: 10255bcb2ece0cf1d51420c8189eb2a2
0 件のコメント:
コメントを投稿