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#具有用于此目的的属性。传统上,我们定义了一个返回私有成员变量的函数。但我认为这看起来并不复杂


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