从另一个 class 访问 class 的私有成员
Accessing private members of a class from another class
我有 3 个 classes
class A {
B *b;
}
class B {
C *c
}
class C {
....
}
从 class A 访问 class B 中的 class C 实例的最佳方法是什么?还请建议一种为每个 classes?
编写构造函数的方法
您有多种访问其他 classes 成员的可能性。
如果成员是私有成员(如您的情况),您可以将其他 class 声明为该 class 的好友,或者写 getter 和 setters.
方法 1:getter 和 setter
class A {
private:
int a;
public:
int GetA() { return a; }
void SetA(int newA) { a = newA; }
};
然而,这将授予从您代码中的所有其他位置访问您的私人数据的权限。尽管您可以离开 setA
导致只能读取私有 a
.
编辑:
正如@tobi303 正确指出的那样:通过 getter 返回原始指针(在您的情况下)可能不是一个好主意。因此,在这种情况下,我建议 return 指针指向的对象或使用像 std::shared_ptr
和 return 这样的智能指针:
class {
private:
int *a;
std::shared_ptr<int> b;
public:
int getA() { return a ? *a : 0; } // only dereference the pointer if it points somewhere
std::shared_ptr<const int> getB() { return b; } // return as std::shared_ptr<const int> to prevent indirect write access to a
};
方法二:交友类
class B
{};
class A {
private:
int a;
public:
friend class B;
};
在这种情况下,只有 B
和 A
可以访问 A
的私有数据。您还可以仅向少数函数授予对私有数据的访问权限。
但是,授予私有成员写入权限通常表明您的设计存在缺陷。也许它们应该是 public(参见方法 3),或者您甚至不需要写入权限,只需读取它们就完全可以满足您的需求。
方法三:Public成员
class A {
public:
int a;
};
类似于方法 1(使用 getter 和 setter),您现在授予 A
的成员 a
读写权限。
如果您确实需要对私有成员进行读写访问,方法 2 是可行的方法。但正如我所说:再想想你的设计,你真的需要这个吗?
我有 3 个 classes
class A {
B *b;
}
class B {
C *c
}
class C {
....
}
从 class A 访问 class B 中的 class C 实例的最佳方法是什么?还请建议一种为每个 classes?
编写构造函数的方法您有多种访问其他 classes 成员的可能性。
如果成员是私有成员(如您的情况),您可以将其他 class 声明为该 class 的好友,或者写 getter 和 setters.
方法 1:getter 和 setter
class A {
private:
int a;
public:
int GetA() { return a; }
void SetA(int newA) { a = newA; }
};
然而,这将授予从您代码中的所有其他位置访问您的私人数据的权限。尽管您可以离开 setA
导致只能读取私有 a
.
编辑:
正如@tobi303 正确指出的那样:通过 getter 返回原始指针(在您的情况下)可能不是一个好主意。因此,在这种情况下,我建议 return 指针指向的对象或使用像 std::shared_ptr
和 return 这样的智能指针:
class {
private:
int *a;
std::shared_ptr<int> b;
public:
int getA() { return a ? *a : 0; } // only dereference the pointer if it points somewhere
std::shared_ptr<const int> getB() { return b; } // return as std::shared_ptr<const int> to prevent indirect write access to a
};
方法二:交友类
class B
{};
class A {
private:
int a;
public:
friend class B;
};
在这种情况下,只有 B
和 A
可以访问 A
的私有数据。您还可以仅向少数函数授予对私有数据的访问权限。
但是,授予私有成员写入权限通常表明您的设计存在缺陷。也许它们应该是 public(参见方法 3),或者您甚至不需要写入权限,只需读取它们就完全可以满足您的需求。
方法三:Public成员
class A {
public:
int a;
};
类似于方法 1(使用 getter 和 setter),您现在授予 A
的成员 a
读写权限。
如果您确实需要对私有成员进行读写访问,方法 2 是可行的方法。但正如我所说:再想想你的设计,你真的需要这个吗?