C++ C++;访问控制
我想在一个类中定义一个变量,它可以被任何其他函数读取,但只能被成员函数修改。例如,C#具有用于此目的的属性。传统上,我们定义了一个返回私有成员变量的函数。但我认为这看起来并不复杂C++ C++;访问控制,c++,visual-c++,C++,Visual C++,我想在一个类中定义一个变量,它可以被任何其他函数读取,但只能被成员函数修改。例如,C#具有用于此目的的属性。传统上,我们定义了一个返回私有成员变量的函数。但我认为这看起来并不复杂 在C++中有其他方法吗?< /p> < p>关于返回私有成员的疑虑是不必要的。< /P> class Thing { public: const std::string& GetString() const { return m_String; } // users can access m_Strin
在C++中有其他方法吗?< /p> < p>关于返回私有成员的疑虑是不必要的。< /P>
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;
};
不。GETTER函数(以及如果必要的SET)也是访问数据成员的C++方式。通常,可以将任何数据成员设置为私有变量以确保封装。只有当你设计的不是真实的类,而只是一组“数据”,而不是(本身)有很多行为时,你才可以使用公共数据成员,在这种情况下,将它定义为结构体是很常见的。
如果你在VisualStudio中写,而不是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;
}
};
模板
类属性{
朋友所有者;
公众:
属性(常数T和v):m_v(_v){
}
算子T(){
返回m_v;
}
私人:
T m_v;
属性和运算符=(常量属性和v){
m_v=v.m_v;
归还*这个;
}
属性和运算符=(常量T&v){
m_v=v;
归还*这个;
}
};
并在你的课堂上公开声明
class Test {
public:
Test() : Data(0) {}
Property<int, Test> Data;
void SetData(int data) {
Data = data;
}
};
类测试{
公众:
Test():数据(0){}
财产数据;
void SetData(int数据){
数据=数据;
}
};
所有的C属性都是一个漂亮的包装,与C++所讨论的内容相同。只需创建一个私有(或受保护)成员变量,提供一个公共get和一个私有/受保护setter,就可以有效地实现c#的功能。复杂与否。@DavidHope或根本没有setter。这不是上述问题的重复,因为这是关于继承的问题,而这是关于C#风格只读访问的问题。什么。。。真正地你能链接到文档吗?C++/CLI有一些属性…这里链接:operator T()
是非常量,因此你不能读取常量Test::Data
对象的底层int
<代码>运算符T()
正在按值返回m_v,这可能会导致性能下降。此外,template属性不符合5的规则。您可以添加运算符T()const。还可以管理按值返回的对象。请不要将此视为生产代码,这只是一个想法的示例。哇!这就是我想要的!!谢谢大家!@不,这不是C++/CLI。我更新了答案,以显示C++ /CLI属性。这是微软扩展,不是标准C++。所以它只能在MSVC上编译。@user1610015是的,注意到它不是CLI,但它仍然是MS
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;
ref class A
{
private:
String^ m_theString;
public:
property String^ TheString
{
String^ get()
{
return m_theString;
}
}
};