指向类的私有数据成员的指针

时间:2010-07-04 13:09:58

标签: c++

是否可以声明指向类的私有数据成员的指针?如果是这样,你怎么做?

6 个答案:

答案 0 :(得分:22)

是的,和创建任何其他指针的方式相同。当然,捕获是因为成员是私有的,你只能在类里面创建指针,在那里你可以看到成员。

class A 
{
  public:
    int* getFooPtr()
    {
       return &foo;  // OK; Inside the class foo is visible
    }

  private:
    int foo;
};

int main()
{
   A a;

   int* p_foo1 = &a.foo; // Illegal; Outside the class, foo is private
   int* p_foo2 = a.getFooPtr(); // OK; getFooPtr() is a public member function
}

因此可以创建指向私有成员的指针,但只能在类的成员函数内部,并且可以从成员函数返回那些创建的指针。返回指向私人成员的指针是否是一个好主意完全是另一个问题(通常这不是一个好主意)。

答案 1 :(得分:5)

如果您利用C ++允许您在显式实例化中传递私有成员的地址这一事实,则可以在声明类之外访问任何非静态私有成员。但是,您将无法访问静态私有成员,因为您必须使用指向此成员的成员指针。

f i j > 0

您可以在此处找到struct A { A() : x("proof!") {} private: char const* x; }; template class stow_private<A_x,&A::x>; int main() { A a; // Use the stowed private member pointer std::cout << a.*stowed<A_x>::value << std::endl; }; 的详细信息和详细信息: http://bloglitb.blogspot.hu/2010/07/access-to-private-members-thats-easy.htmlhttps://gist.github.com/dabrahams/1528856

答案 2 :(得分:2)

是的,这是可能的。您必须从类的上下文中返回指针(或引用),或者具有friend访问该类的人。这是因为变量本身是私有的,因此无法访问。

class C
{
public:
    int* getXPointer()
    {
        return &x;
    }

    int& getXReference()
    {
        return x;
    }

private:
    int x;
};


int main(int argc, char* argv[])
{
    C c;
    int* p = c.getXPointer();
    int& r = c.getXReference();
    assert(p == &r);
    return 0;
}

答案 3 :(得分:2)

是的,正如先前的答案所证明的那样,这是可能的。但正如Tyler McHenry所说:“这是一个好主意吗?”不,不是。有充分理由将成员变量声明为私有,并以这种方式破坏封装只会导致麻烦。

答案 4 :(得分:1)

你的问题的措辞相当混乱。当有人说“声明指向某事”的指针时,他们通常会讨论指针的类型相关属性,如“声明指向int的指针”。私有属性根本不影响成员的类型,这意味着类型int的成员始终只是类型int的成员,无论它是公共的还是私有的。这立即意味着类型int *的指针始终可以指向类型为int的公共成员,或指向类型为int的私有成员。无论会员是公共会员还是私人会员都无关紧要。

措辞中的另一个含糊之处是在C ++中有普通指针(如int *),并且有“指向成员指针”类型的指针(如int MyClass::*)。当你说“指向类的数据成员的指针”时,你不清楚你在谈论什么样的指针:普通或指向成员的指针。但是,上述内容仍适用于这两种类型:两者都可以轻松指向班级的公共,受保护或私人成员。私密性没有区别。

同样,“私有”的属性不会影响成员的类型,只会在名称直接引用时影响其可访问性。因此,为了使指针指向类的私有数据成员,您必须在可访问该私有数据成员的区域中初始化该指针(或分配给它):在拥有类的方法内部或内部朋友的功能。

答案 5 :(得分:-1)

是的,如果我理解你的话,你希望能够返回指向某个私人成员的指针吗?

private:
        int hidden;
    public:
        int& unHide ()
        {
            return hidden;
        }