无需使用朋友类即可访问私人成员[重复]

问题描述 投票:0回答:2

我有一个作业,其中:

我们有此代码:

#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或使用朋友类,我们必须阅读xy并进行更改。

我搜索并找到了以下方式:

如果我的课堂上有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;
}

我的问题是:

  1. 在其他面向对象的语言中这可能吗?
  2. 这是否意味着访问修饰符没有用?
  3. 我们有什么办法可以防止这种情况发生?
c++ pointers private encapsulation access-modifiers
2个回答
2
投票
  1. (带有指针)为什么会发生这种情况?

0
投票

回答您的问题4,我们能做些什么来防止这种事情发生?:

© www.soinside.com 2019 - 2024. All rights reserved.