電子書籍の厳選無料作品が豊富!

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

A 回答 (4件)

C++ Properties - a Library SolutionにC++でプロパティを実現する方法が掲載されています。


http://www.open-std.org/jtc1/sc22/wg21/docs/pape …

次のように書くことができます。

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;
};
    • good
    • 0

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

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

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

    • good
    • 0

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



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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!