【问题标题】:Read private variables class members读取私有变量类成员
【发布时间】:2016-02-07 13:03:17
【问题描述】:

我是 C++ 新手,我需要在不同类中的方法中读取类的私有类成员,例如:

class a{
private:
int x;

}

class b{
void foo();
}

void b::foo(){
//here I want to read from x that's in a
}

我是否必须在class a 中设置一个函数,例如int readx(){return x);)a readclass(){return *this);}?还有其他方法吗?

【问题讨论】:

  • 你可以使用可以访问x的好友功能。
  • 你应该认为它可能被宣布为私有是有原因的。
  • @NeilKirk:对,例如如果类的设计者考虑到以后能够扩展它以用于多线程环境,其中未经审计的状态访问是一个游戏杀手。
  • @NeilKirk 我在几个地方读到所有类变量都应该是私有的。

标签: c++ class c++11 private


【解决方案1】:

声明friend 函数或类将授予对该函数或类a 的x 的读写访问权限,a

class a {
public:
   const int& readx() const { return x; }
private:
   int x 
};

或者,如果你更喜欢这种语义

class a {
public:
   const int& x() const { return x_; }
private:
   int x_; 
};

仅授予读取权限,但授予每个客户端。

【讨论】:

  • 为什么在函数名后面加const?
  • @kuhaku 第一个const 确保只读访问(注意它是一个引用,而不是返回的值),第二个允许在const a 实例上调用它。除了 C++(和 C)中的一个通用经验法则是成语 const as const can - 不需要可变的东西,也应该总是这样声明 - const 即.
【解决方案2】:

类的私有部分的目标是“隐藏”您处理数据的方式,提供一种使用公共方法访问所述数据的简化方式。 使用公共方法更改私有成员的值的优点是,例如,您可以只允许 'x' 的值介于 0 和 10 之间。

在您的情况下,您应该考虑“x”在您的第一堂课中代表什么,以及第二堂课是否可以在没有任何控制或特殊考虑的情况下直接访问它。如果是这种情况,它可能应该是一个公共价值。在另一种情况下,您将需要创建一个公共方法来读取它,例如您的 readx 示例。 如果只有'b'有权限直接访问'x',你也可以定义一个朋友函数,就像有人已经说过的那样。

请注意,返回指向实例的指针将不允许访问类的私有成员。

【讨论】:

    【解决方案3】:

    如果 a 类中没有此数据成员的访问器,则应将 b 类的成员函数声明为 a 类的友元函数。

    例如

    #include <iostream>
    
    class B
    {
    public:    
        void foo() const;
    };
    
    class A
    {
    public:
        A( int x ) : x( x ){}
    private:    
        friend void B::foo() const;
        int x;
    };
    
    void B::foo() const
    {
        A a { 10 };
        std::cout << a.x << std::endl;
    }
    
    int main()
    {
        B().foo();
    
        return 0;
    }
    

    【讨论】:

    • : x( x ){} 那是什么?
    • @kuhaku 就是所谓的ctor初始化。冒号后的表达式 x( x ) 用参数 x 的值初始化数据成员 x。
    【解决方案4】:

    你可以实现一个可以访问 foo 中的 x 的友元函数。

    Reference

    【讨论】:

    • 您应该发布更多内容,因为该链接将来可能会消失。
    【解决方案5】:

    您可以使用友元类或函数,但使用方法的私有成员是个坏主意(测试只是这样做的合理借口)。如果无法避免使用私有成员,最好使用公共方法或重新设计代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2015-05-04
      相关资源
      最近更新 更多