是否可以声明指向类的私有数据成员的指针?如果是这样,你怎么做?
答案 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.html和
https://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;
}