gpt4 book ai didi

c++ - 防止程序员使用任何技巧来访问私有(private)类成员

转载 作者:太空狗 更新时间:2023-10-29 20:23:40 24 4
gpt4 key购买 nike

通过将成员声明为私有(private),非友元函数无法直接访问该成员。但是有一种方法可以通过使用指针的类型转换来访问它们,例如:

class Foo {

private:
int value;

public:
inline int get() {
return value;
}
inline Foo (int value) {
Foo::value = value;
}

} foo(1234);

int main() {
using namespace std;
cout << foo.display() << endl; // display 1234
int *p = (int *)(&foo); // HERE!
*p = 5678;
cout << foo.display() << endl; // display 5678, foo.value has been changed
return 0;
}

我们可以阻止用户使用这些技巧吗?或者我们可以禁止将 Foo * 转换为 int * 吗?

最佳答案

嗯,不,不可能阻止坚定的程序员进行显式类型转换,因为有足够坚定的程序员可以使用几乎无限多种方式 - 特别是如果愿意接受潜在的未定义行为。

从哲学上讲,C++ 类型系统的设计通常是为了让偶然做事变得更加困难。但是,它并不是为了防止程序员故意破坏类型系统而设计的。

可以通过组合使用技术使事情变得更加困难;

  1. 使用 pimpl 习语(parapura rajkumar 在回答中已经提到)
  2. 向成员(包括 pimpl)引入偏移量。例如,实现细节可能会偏移 18 个字节,这对程序员来说不一定是显而易见的。
  3. 为您的类提供一个私有(private)的operator&(),这将起到防止使用&object 获取对象地址的作用。
  4. 不要提供返回this 的成员函数,也不要返回(或引用)任何私有(private)或 protected 类数据的地址。并且没有公开数据。

然而,即使没有访问源代码,一个足够坚定的程序员也会找到一种方法来解决像这样的各种技巧。这些类型的技巧也有不幸的影响,使开发人员更难以您可能想要的更常用的方式使用您的类。

关于c++ - 防止程序员使用任何技巧来访问私有(private)类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31903360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com