强制性输出private中变量的三种方法

众所周知,private里面的变量不可以输出,但是也可以通过特殊途径获得。

1.通过指针暴力内存,把它索罗出来,方法:调试,破掉语法。

并且还可以对类对象进行修改。

 1 // Thread.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <WinSock2.h>
 6 #include <Windows.h>
 7 
 8 #include <iostream>
 9 using namespace std;
10 class MyClass
11 {
12 public:
13     MyClass();
14     ~MyClass();
15     int m_1;
16 protected:
17     int m_2;
18 private:
19     int m_3;
20 };
21 
22 MyClass::MyClass()
23 {
24     m_1 = 10;
25     m_2 = 20;
26     m_3 = 20;
27 }
28 
29 MyClass::~MyClass()
30 {
31 }
32 int main()
33 {
34     MyClass Object;                                                             
35 
36     printf("%d\r\n", *((int*)(&Object) + 1));
37     return 0;
38 }
卷珠帘

 

2.在类中提供函数,但丧失了读的属性。

// Thread.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <Windows.h>

#include <iostream>
using namespace std;

class MyClass
{
public:
    MyClass();
    ~MyClass();
    int m_1;
    int Getm_3()
    {
        return m_3;
    }
protected:
    int m_2;
private:
    int m_3;
};

MyClass::MyClass()
{
    m_1 = 10;
    m_2 = 20;
    m_3 = 20;
}

MyClass::~MyClass()
{
}
int main()
{
    MyClass Object;                                                               
    printf("%d\r\n", Object.Getm_3()); //必须提供接口,并且只能读,不能修改。
    return 0;
}
卷珠帘

 

3.王道:启动线程与类结合。线程可以破除class的私有属性。

 1 // Thread.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <WinSock2.h>
 6 #include <Windows.h>
 7 
 8 #include <iostream>
 9 using namespace std;
10 //类与线程,线程可以访问非全局变量,尤其是私有指针
11 
12 class MyClass
13 {
14 public:
15     MyClass();
16     ~MyClass();
17     int m_1;
18 protected:
19     int m_2;
20 private:
21     int m_3;
22 public:
23     static DWORD WINAPI ThreadProc(LPVOID Param); //线程不能所属一个类里,所以必须加关键字,static
24     VOID Sub_1()
25     {
26         HANDLE ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, 0, NULL);
27         WaitForSingleObject(ThreadHandle, INFINITE);
28     }
29 };
30 
31 MyClass::MyClass()
32 {
33     m_1 = 10;
34     m_2 = 20;
35     m_3 = 20;
36 }
37 
38 MyClass::~MyClass()
39 {
40 }
41 
42 DWORD WINAPI ThreadProc(LPVOID Param);
43 int main()
44 {
45     MyClass Object;
46     Object.Sub_1();
47     return 0;
48 }
49 
50 DWORD WINAPI MyClass::ThreadProc(LPVOID Param)
51 {
52     printf("%d\r\n", ((MyClass*)(Param))->m_3);
53     return 0;
54 }
卷珠帘

 

posted @ 2016-09-25 12:42  卷珠帘  阅读(650)  评论(0编辑  收藏  举报