我想在一个类中定义一个可以被任何其他函数读取但只能由成员函数修改的变量。例如,C# 具有用于此目的的属性。传统上,我们定义了一个返回私有成员变量的函数。但我认为这看起来并不复杂。
在 C++ 中有没有其他方法可以做到这一点?
我想在一个类中定义一个可以被任何其他函数读取但只能由成员函数修改的变量。例如,C# 具有用于此目的的属性。传统上,我们定义了一个返回私有成员变量的函数。但我认为这看起来并不复杂。
在 C++ 中有没有其他方法可以做到这一点?
不。Getter 函数(如果需要,还有 Setter)是访问数据成员的 C++ 方法。通常,您将任何数据成员设为私有变量以确保封装。仅当您设计的不是真正的类而是仅没有(很多)行为的“一堆数据”时才使用公共数据成员,在这种情况下,通常将其定义为结构。
您对恢复对私人成员的访问权的疑虑是没有根据的。
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;
};
如果您在 Visual Studio 中编写,则 C++ 中的属性(如 C#)。但当然是特定于编译器的。如果你问我,我更喜欢“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;
}
};
并在您的班级公共成员中声明,例如
class Test {
public:
Test() : Data(0) {}
Property<int, Test> Data;
void SetData(int data) {
Data = data;
}
};
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++/CLI 属性(用于托管类),它们更接近于 C# 属性:
ref class A
{
private:
String^ m_theString;
public:
property String^ TheString
{
String^ get()
{
return m_theString;
}
}
};