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