访问外部类中的内部类私有变量


//In file1.hpp
class A
{
protected:      
class B
{
public:
B () {};
};
};
// In file2.hpp
class C
{
public:
void getValue()
{ 
D obj; ---- error: no matching function for call to D
printf("%dn",obj.c);  
}
class D : public A::B 
{
friend class C; -- I tried writing this but still no luck.
public:
D(int a, int b) : c(a), d(b) {}
virtual ~D() {}
//something
private:
int c; int d;
};
class E : public D
{
E() : D(1,2) {}
virtual ~E() {}
};
}
int main()
{
C::E obj;
}

在公共函数getValue中,我想访问类D的私有成员变量,它们是(c和D(。我该怎么做?我试着把";朋友类C";在类D中,然后尝试在getValue函数中创建类D的对象,但我总是得到0,而不是像c=5或D=6这样的值。

如果我在下面的区域打印值,我会得到正确的值。我将无法向您展示getValue是如何调用的,只是想象一下它是以某种方式调用的。我只需要在里面打印c,d。

D(int a, int b)
: c(a), d(b) {};

EDIT:在getValue中实例化时,我做了如下操作D obj;---错误:对D 的调用没有匹配功能

举以下例子:

#include <iostream>
//In file1.hpp
class A
{
protected:      
class B
{
public:
B () = default;
};
friend class C; // <-- bad idea
};
// In file2.hpp
class C
{
public:
void getValue()
{
// Creating an object E?
E objE;
// Access c and d
std::cout << "c:" << objE.c << ", d:" << objE.d << std::endl;
}

class D : public A::B // <-- bad idea?
{
public:
D(int a, int b): c(a), d(b) {}
virtual ~D() {}
//something
private:
int c; // dangerous to not initialize basic types
int d;
friend class C; // <-- bad idea
};
class E : public D
{
public:
E() : D(1,2) {}
virtual ~E() {}
};
};
int main()
{
C objC;
objC.getValue();
}

(您可以在此处运行:https://onlinegdb.com/hNfm7Pvg0f(

首先,要在C::getValue中访问E的一个实例,所以我实例化了一个对象。

privateprotected表示这些属性和方法不公开(封装(,这正是您想要做的。您可以使用friend关键字进行例外处理,但这不是一个好主意(我可能在20年的运营生涯中使用过两次(。但是嘿!它是有效的。