• 締切済み

C++で外部メソッド呼出をReadonlyにしたい

C++で、外部からメソッド変数を読み込み専用で使いたいです。 class Test { private: char ro[32]; Test(){ strcpy(ro, "hello world"); } }; // 何かの仕組み(C++のテンプレートを良く知りませんが可能でしょうか?) Test a; printf("%s\n", a.ro); // OK strcpy(a.ro, "hoge"); // OUT // Objective-Cみたいな // @property (readonly) char *ro; // @synthesize ro; // のようにして、リードオンリーだけアクセスできる g++でコンパイルして、動作確認できるサンプルがあると助かります。

みんなの回答

回答No.4

C++ Properties - a Library SolutionにC++でプロパティを実現する方法が掲載されています。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1615.pdf 次のように書くことができます。 class Test { private: std::string my_string; int my_int; std::string get_my_string() { return my_string; } int get_my_int() { return my_int; } public: Test() : my_string("hello world"), my_int(1) { MyString(this); MyInt(this); } //リードオンリープロパティ ROProperty<std::string, Test, &Test::get_my_string> MyString; ROProperty<int, Test, &Test::get_my_int> MyInt; }; int _tmain(int argc, _TCHAR* argv[]) { Test a; std::string s = a.MyString; //読み込み int i = a.MyInt; //読み込み std::cout << s << std::endl; //=> hello world std::cout << i << std::endl; //=> 1 // a.MyString = "hello"; //書き込み不可。コンパイルエラー return 0; } リードオンリープロパティを実現するコードは次のようになります。 template<class T, class Object, typename T(Object::*real_getter)()> class ROProperty { Object * my_object; public: void operator()(Object * obj) { my_object = obj; } T operator()() const { return (my_object->*real_getter)(); } T get() const { return (my_object->*real_getter)(); } void set(T const & value); operator T() const { return (my_object->*real_getter)(); } typedef T value_type; };

  • gentoo314
  • ベストアンサー率41% (15/36)
回答No.3

C++ には、プロパティの概念がなく、リードオンリーの制御ができません。制御するにはメソッドを作るしかありません。 roの先頭番地を返すと書き換えができてしまうので、受け取りバッファを指定して、 roが書き込まれないように細工します。 class Test { public: char* get_ro(char* buf) const { strcpy(buf, ro); return buf; } private: char ro[32]; }; strcpy(a.get_ro(buf), "hoge"); をコンパイル時点で防止はできませんが、 実行しても buf を壊すだけで、ro[32]は守られます。 実際の実装では bufは格好悪いので、roはstringクラスに変えて class Test { public: string get_ro() const { return ro; } private: string ro; }; の方がシンプルになると思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「メソッド変数」ってなに?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

getterメソッド用意するのではダメですか? const char *getRo(void) const { return ro; }

関連するQ&A