c++編譯時如何把private屬性變成public?
c++編譯時如何把private屬性變成public?
在做一些已經寫好的代碼的單元測試的時候,有時候需要使用到類私有的成員方法或變量。我們不想改動原來的代碼,但是又能訪問這些私有或者受保護的方法,遇到這種情況怎麼辦?
1.手工替換
在原有代碼中將private手工替換成public,將protected手工替換成public.
這種方法是我們最不想用的方法,因為這需要改變原來的代碼。
2.宏替換
這種方法比較討巧,但也很好用,我們可以定義兩個宏:
#define private public #define private public
這樣就可以把所有的private和protected替換成public了。這要求你改變測試代碼.
3.使用g++的參數-D
g++本身擁有許多的參數選項,下麵這幾個參數能夠在編譯時動態添加宏定義或者取消宏定義。
-Dmacro
相當於C語言中的#define macro
-Dmacro=defn
相當於C語言中的#define macro=defn
-Umacro
相當於C語言中的#undef macro
因此,我們可以這樣編譯:
CPPFLAGS=-Dprotected=public -Dprivate=public $(CC) $(GTEST_CPPFLAGS) $(CPPFLAGS) -g -c src/inifile.cpp
這個方法的本質和方法二是一致的,都是通過宏將private,protected替換成public.最大的區別是這種方法不用改原來的庫代碼或者測試代碼。而隻有改makefile就可以了。
下麵附上一個例子:
examp.cpp
#include <iostream> using namespace std; //#define private public //#define protected public class Foo { private: void show(){cout<<"I'm private show!"<<endl;} }; class FooTest { public: void test() { Foo f; f.show(); } }; int main() { FooTest t; t.test(); return 0; }
makefile
CPPFLAG +=-Dprotected=public -Dprivate=public all: g++ $(CPPFLAG) -g -o examp examp.cpp
歡迎光臨
我的網站----蝴蝶忽然的博客園----人既無名的專欄。如果閱讀本文過程中有任何問題,請聯係作者,轉載請注明出處!
最後更新:2017-04-03 05:39:53