閱讀329 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Swift中的注釋以及表達式
  下一篇:go 通過金礦模型介紹動態規劃