みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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++でコンパイルして、動作確認できるサンプルがあると助かります。

投稿日時 - 2012-03-20 21:46:19

QNo.7374107

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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;
};

投稿日時 - 2012-03-29 20:35:28

ANo.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;
};

の方がシンプルになると思います。

投稿日時 - 2012-03-21 22:37:09

ANo.2

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

投稿日時 - 2012-03-20 23:47:03

ANo.1

getterメソッド用意するのではダメですか?

const char *getRo(void) const { return ro; }

投稿日時 - 2012-03-20 22:05:00

あなたにオススメの質問