众所周知,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 ", *((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 ", 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 ", ((MyClass*)(Param))->m_3); 53 return 0; 54 }