クラス内で、他の関数で読み取ることができる変数を定義したいと考えていますが、メンバー関数によってのみ変更できます。たとえば、C# にはこの目的のための Property があります。従来、プライベート メンバー変数を返す関数を定義してきました。しかし、それは洗練されたようには見えないと思います。
C++ でこれを行う他の方法はありますか?
クラス内で、他の関数で読み取ることができる変数を定義したいと考えていますが、メンバー関数によってのみ変更できます。たとえば、C# にはこの目的のための Property があります。従来、プライベート メンバー変数を返す関数を定義してきました。しかし、それは洗練されたようには見えないと思います。
C++ でこれを行う他の方法はありますか?
いいえ。ゲッター関数 (および必要に応じてセッターも) は、データ メンバーにアクセスするための C++ の方法です。一般に、カプセル化を確実にするために、任意のデータ メンバーをプライベート変数にします。パブリック データ メンバーを使用するのは、設計しているものが実際のクラスではなく、それ自体に (多くの) 動作を持たない単なる「データの集まり」である場合に限られます。この場合、それを構造体として定義するのが一般的です。
Visual Studio で書く場合は、C# のような C++ に Property があります。しかし、もちろんコンパイラ固有です。私に言わせれば、「get」関数の方が好きです
C++ にはプロパティのようなものはありません。C# でさえ、これは set/get 関数のペアです。ほんの少しの砂糖。
しかし、プロパティとほとんど同じように見える何かを行うことができます。
このクラスのプロトタイプを見てください
template<class T, class Owner>
class Property {
friend Owner;
public:
Property(const T &_v) : m_v(_v) {
}
operator T() {
return m_v;
}
private:
T m_v;
Property<T,Owner>& operator = (const Property<T,Owner> &v) {
m_v = v.m_v;
return *this;
}
Property<T,Owner>& operator = (const T& v) {
m_v = v;
return *this;
}
};
そして、クラスの public メンバーで次のように宣言します
class Test {
public:
Test() : Data(0) {}
Property<int, Test> Data;
void SetData(int data) {
Data = data;
}
};
プライベート メンバーへのアクセスを返すことについてのあなたの不安は不当です。
class Thing
{
public:
const std::string& GetString() const { return m_String; } // users can access m_String by calling GetString()
void SomeRandomFunc() { m_String = "Hello"; } // member functions can write to m_String
private:
std::string m_String;
};
class A
{
private:
string m_string;
public:
const string& GetString() const
{
return m_string;
}
__declspec(property(get=GetString)) string String;
};
A a;
cout << a.String << endl;
ただし、それでも C# ほど良くはありません。
もちろん、C# プロパティに近い C++/CLI プロパティ (マネージ クラス用) もあります。
ref class A
{
private:
String^ m_theString;
public:
property String^ TheString
{
String^ get()
{
return m_theString;
}
}
};