【问题标题】:C++ Access Control [duplicate]C ++访问控制[重复]
【发布时间】:2013-01-27 23:27:02
【问题描述】:

我想在一个类中定义一个可以被任何其他函数读取但只能由成员函数修改的变量。例如,C# 具有用于此目的的属性。传统上,我们定义了一个返回私有成员变量的函数。但我认为这看起来并不复杂。

在 C++ 中有没有其他方法可以做到这一点?

【问题讨论】:

  • 所有的 C# 属性都是对你用 C++ 谈论的同一件事的漂亮包装。只需创建一个私有(或受保护)成员变量,提供公共获取和私有/受保护设置器,您就可以有效地了解 c# 正在做什么。复杂与否。
  • @DavidHope 或者根本没有二传手。
  • 不是与上述问题的重复,因为那是关于继承的,而这个是关于 C# 样式的只读访问的。

标签: c++ visual-c++


【解决方案1】:
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;
        }
    }
};

【讨论】:

  • 哇!这就是我想要的!!谢谢!
  • @ArneMertz 不,这不是 C++/CLI。我更新了答案以显示 C++/CLI 属性。
  • 这是 Microsoft 扩展,而不是标准 C++。所以它只会在 MSVC 上编译。
  • @user1610015 是的,注意到它不是 CLI - 但它仍然是 MS-only
【解决方案2】:

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


    }
    };

【讨论】:

  • operator T() 是非常量的,因此您无法读取 const Test 对象的 Test::Data 的底层 intoperator T() 按值返回 m_v,这可能会导致性能下降。模板属性也不遵守五规则。
  • 你可以添加 operator T() const。也可以管理按值返回对象。请不要将此视为生产代码,这只是一个想法的示例。
【解决方案3】:

如果您在 Visual Studio 中编写,则 C++ 中的属性(如 C#)。但当然是特定于编译器的。如果你问我,我更喜欢“get”函数

【讨论】:

【解决方案4】:

没有。 Getter 函数(以及必要时的 Setter)是访问数据成员的 C++ 方法。通常,您将任何数据成员设为私有变量以确保封装。仅当您设计的不是真正的类而是仅没有(很多)行为的“一堆数据”时才使用公共数据成员,在这种情况下,通常将其定义为结构。

【讨论】:

    【解决方案5】:

    您对恢复对私人成员的访问权的疑虑是没有根据的。

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

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 2021-08-22
      • 2013-10-13
      • 2015-10-18
      相关资源
      最近更新 更多