【发布时间】:2020-09-24 10:31:57
【问题描述】:
我有一个家庭作业:
我们有这个代码:
#include <iostream>
using namespace std;
class Test {
int x;
char y;
public:
Test() :x(0), y(0) { ; }
};
int main() {
Test t;
//Do stuff!
return 0;
}
在不添加 getter 和 setter 或使用朋友类的情况下,我们必须阅读 x 和 y 并更改它们。
我搜索并找到了这些方法:
如果我的课堂上有 template 函数,我可以说:
class Test {
int x;
char y;
public:
Test() :x(0), y(0) { ; }
template<typename T>
void do_something() {//not necessarily void function
//Do some stuff
};
};
class a;
// My specialization.
template <>
void Test::do_something<a>() {
cout << x << endl;
cout << y << endl;
// getting data
x = 5;
y = 'a';
// changing data
cout << x << endl;
cout << y << endl;
// getting data after changes we made
}
int main() {
Test t;
t.do_something<a>();
return 0;
}
我认为是这个问题的答案的方法也是使用指针。
像这样:
class Test {
int x;
char y;
public:
Test() :x(0), y('0') { ; }
};
int main() {
Test t;
int* ptr = (int*)&t;
cout << "x = " << *ptr << " y = " << (char)*(ptr + 1) << endl;
*ptr--;
//getting data
*ptr = 12;
ptr++;
*ptr = 65;
//changing data
ptr--;
cout << "x = " << *ptr << " y = " << (char)*(ptr + 1) << endl;
//getting data after changes we have made
return 0;
}
或使用reinterpret_cast 和指针:
struct pointer {
int x;
char y;
};
class Test {
int x;
char y;
public:
Test() :x(0), y('0') { ; }
};
int main()
{
Test t;
pointer* p = reinterpret_cast<pointer*>(&t);
cout << "X = " << p->x << " Y = " << p->y << endl;
//getting data
p->x = 5;
p->y = 'a';
//changing data
cout << "X = " << p->x << " Y = " << p->y << endl;
//getting data from class after changing them with pointers
return 0;
}
我的问题是:
- 在其他面向对象的语言中是否有可能?
- 这是否意味着访问修饰符无用?
- 我们能做些什么来防止这种事情发生吗?
【问题讨论】:
-
问题不清楚。你说你不能修改
Test,但你所有的尝试都会修改Test。如果允许您修改它,那么您应该编写 getter 和 setter(没有模板,绝对不是reinterpret_cast) -
红绿灯没用吗?我的意思是当它是红色时我仍然可以过马路......访问说明符不是为了防止你做错事,他们是为了帮助你避免做错事(如果你努力你仍然可以做错事)
-
如果可以将
do_something()添加到Test,则可以添加get_x()、get_y()、set_x()和set_y()。 -
值得注意的是,第二种方法是未定义的。该语言不允许将
Test指针转换为int指针,然后取消引用该指针。 -
基本上,这应该可以工作:
Test t; pointer p; memcpy(&p, &t, sizeof(Test)); p.x = 1; p.y =1; memcpy(&t, &p, sizeof(Test));。
标签: c++ pointers private encapsulation access-modifiers