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


欢迎光临

我的网站----蝴蝶忽然的博客园----人既无名的专栏
如果阅读本文过程中有任何问题,请联系作者,转载请注明出处!

时间: 2024-08-02 22:04:13

c++编译时如何把private属性变成public?的相关文章

运行时和编译时元编程—运行时元编程

原文链接   译文链接   译者:JackWang 运行时和编译时元编程 第一部分 Groovy语言支持两种风格的元编程:运行时元编程和编译时元编程.第一种元编程支持在程序运行时修改类模型和程序行为,而第二种发生在编译时.两种元编程有各自的优缺点,在这一章节我们将详细讨论. 注:译者也是第一次接触Groovy,由于时间和水平有限(姑且让译者使用这个理由吧,对待知识本应该一丝不苟)部分专有名词可能翻译不准确甚至有误(读者阅读的过程中最好能参考原文),恳请读者不吝留言指出,谢谢! 1.运行时元编程

运行时和编译时元编程—编译时元编程

原文链接    译文链接     译者:JackWang 运行时和编译时元编程 第二部分 2 编译时元编程 Groovy的编译时元编程支持编译时生成代码.这些变换(译者注:原文该专有名词是transformations,译者直译为变换,也许不准确.如果有知道准确翻译的读者恳请不吝赐教,待译者修正)叫做程序的抽象语法树(AST),在Groovy里,我们叫做AST变换.AST变换支持在编译过程中植入钩子,修改抽象语法树之后继续编译生成正常的字节码流.和运行时元编程相比,这种转换可以在类文件的修改可见

运行时和编译时元编程—运行时元编程(一)

运行时和编译时元编程 第一部分 Groovy语言支持两种风格的元编程:运行时元编程和编译时元编程.第一种元编程支持在程序运行时修改类模型和程序行为,而第二种发生在编译时.两种元编程有各自的优缺点,在这一章节我们将详细讨论. 注:译者也是第一次接触Groovy,由于时间和水平有限(姑且让译者使用这个理由吧,对待知识本应该一丝不苟)部分专有名词可能翻译不准确甚至有误(读者阅读的过程中最好能参考原文),恳请读者不吝留言指出,谢谢! 1.运行时元编程 通过运行时元编程,我们可以推迟运行时的分支决策(译者

c++中编译时出现乱码的原因可能有哪些啊??

问题描述 c++中编译时出现乱码的原因可能有哪些啊?? 下面这个程序就是编译时没错误,运行乱码了,问题出在哪啊?求指导 #include #include using namespace std; class Triangle { public: void setABC(double x,double y,double z) { if(zx+y) cout<<"输入错误,请重新输入:"< cin>>x>>y>>z; } void g

编译时标签(对JSP进行的XSLT预处理)

js|编译 一篇旧文,翻出来回顾一下.BTW,抗议csdn的分类,XML怎能归于.NET之下!! 发信人: HAX(海曦), 信区: WebDevelop 标 题: 发信站: 饮水思源 (2002年02月12日00:10:32 星期二), 站内信件 编译时标签(对JSP进行的XSLT预处理) 原文:http://www.mail-archive.com/taglibs-dev@jakarta.apache.org/msg00390.html From: James Strachan Subjec

cwinthread-在VS2005中单个工程里建立两个CWinThread的派生类,编译时发出C2084错误,怎么解决?

问题描述 在VS2005中单个工程里建立两个CWinThread的派生类,编译时发出C2084错误,怎么解决? =====描述===== 我在VS2005中用项目->添加类添加了两个CWinThread类的派生类--CMyThread与CFloatWndThread,现在编译时报C2084错误,百度上都说是函数有定义了两个函数体,但我没发现有什么重定义啊~~请问大家有何高招?? =====代码===== //MyThread.h #include "stdafx.h" // CM

MSBuild + MSILInect实现编译时AOP之预览

      在本文之前的前几篇浅谈.NET编译时注入(C#-->IL).浅谈VS编译自定义编译任务-MSBuild Task(csproject).编译时MSIL注入--实践Mono Cecil(1)已经讨论了MSBuild和Mono.Cicel.在这里我们将会利用它来实现一个简单的编译时AOP注入机制(这里所说的编译时是指c#到MSIL的预编译过程).我更倾向于像EL(微软企业库框架)这类动态AOP.编译时AOP有PostSharp这种被称之为静态AOP框架,其优势在于直接代码语句,性能更好,

MSBuild + MSILInect实现编译时AOP-改变前后对比

    实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改.Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1).   我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方法,重新组装成一个方法(并加上[CompilerGenerated]标签),在加入横切注入接口前后代码,调用此方法. 比如代码: [TestAOPAttribute(Order = 1)] public C

利用APT实现Android编译时注解

一.APT概述 我们在前面的java注解详解一文中已经讲过,可以在运行时利用反射机制运行处理注解.其实,我们还可以在编译时处理注解,这就是不得不说官方为我们提供的注解处理工具APT (Annotation Processing Tool ). APT用来在编译时期扫描处理源代码中的注解信息,我们可以根据注解信息生成一些文件,比如Java文件.利用APT为我们生成的Java代码,实现冗余的代码功能,这样就减少手动的代码输入,提升了编码效率,而且使源代码看起来更清晰简洁. 从Java5开始,JDK就