一个例子解释C++ 宏的作用

Unixzii 2013-02-10 09:16:24
首先建立一个头文件oop.h,内容如下
#ifndef OOP_H
#define OOP_H

#define PROPERTY_DECL(className,propertyName) \
public: className get##propertyName() { return m_##propertyName; } \
public: void set##propertyName(className val) { m_##propertyName = val; } \
private: className m_##propertyName;

#define APP_INIT(MainClass) \
int main(int argc,char **argv) \
{ \
MainClass instance; \
}

#endif // OOP_H


PROPERTY_DECL宏的作用就是声明一个属性(类似C#的property),它具有赋值函数和取值函数,同时这个宏帮助你声明了一个private变量来存储这个值。

下面就实践一下它的使用,新建test.h:
#ifndef TEST_H
#define TEST_H

#include "oop.h"

class Test
{
PROPERTY_DECL(int,Count) //注意这里,使用到了这个宏!
public:
Test();
};

#endif // TEST_H


test.cpp:
#include "test.h"
#include <iostream>

Test::Test()
{
setCount(10);
std::cout << "Hello!" << std::endl;
std::cout << "Function getCount() result: " << getCount() << std::endl;
}

APP_INIT(Test)


到这里就没有main.cpp了,因为我把main函数的声明也交给了宏来完成。
...全文
450 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-02-18
  • 打赏
  • 举报
回复
编译选项加/EP /P,重新编译,查看宏展开后对应的.i文件。gcc加-E
就是那个党伟 2013-02-17
  • 打赏
  • 举报
回复
shenxiaolong1976 2013-02-16
  • 打赏
  • 举报
回复
good,dingqiang107的做法是正解,楼主的做法太幼稚了。 而我们通常只用宏来完成不用宏不可能完成的任务:比如特定条件下从函数中返回。
dingqiang107 2013-02-16
  • 打赏
  • 举报
回复
get()用于抽象对象的封装,比如说正方形get_width()和get_length()返回同一变量,长方形返回不同变量。或者get_char()可能是读取内存或文件或网络。set()可用于赋值的合法性检查。只需在set()函数中assert一次,就用不着每次使用前都assert了。这些情况编写统一的宏意义不大,因为每处用法都不同。 如果只为了简化代码,也应使用模板类,不应当用宏。 template<class T> struct PROPERTY_DECL { T get(){return m_property;} void set( T t ){ m_property=t; } private : T m_property; }; class Test { PROPERTY_DECL<int > Count; }; Test instance; int a = instance.Count.get(); instance.Count.set(10)
唯恐天下不乱 2013-02-15
  • 打赏
  • 举报
回复
有一种说法是,为了防止错误的赋值, 比如说,一个变量只能接受1~5的值,其他的就不给于赋值 还有就是一种绑定的思想,如,给一个变量赋值,然后要把这个变量记录到文件中。这个时候可以通过函数完成。.net中好像是用Property来做的 像楼主这种宏,有必要再增加这个么?还是说有什么特殊规则?
引用 9 楼 unixzii 的回复:
引用 7 楼 shit_moment 的回复:我一直不明白,为什么一个变量可以被set/get。 那么为什么不把这个变量设为public? 这样C#的属性概念还有什么用呢?
Unixzii 2013-02-15
  • 打赏
  • 举报
回复
引用 7 楼 shit_moment 的回复:
我一直不明白,为什么一个变量可以被set/get。 那么为什么不把这个变量设为public?
这样C#的属性概念还有什么用呢?
angel725 2013-02-13
  • 打赏
  • 举报
回复
初学的没看太明白
唯恐天下不乱 2013-02-13
  • 打赏
  • 举报
回复
我一直不明白,为什么一个变量可以被set/get。 那么为什么不把这个变量设为public?
fayn86 2013-02-13
  • 打赏
  • 举报
回复
你这个和MFC的差不多
bluewanderer 2013-02-11
  • 打赏
  • 举报
回复
从这个角度解释宏的作用有点太局限了。
qq120848369 2013-02-10
  • 打赏
  • 举报
回复
引用 3 楼 taodm 的回复:
一个类有很多很多属性,并且还直接get/set,一般就是一个设计上的错误。 当心,不要在错误的问题上探讨正确解。
这到是真的, 另外一般这种设计都是根据业务需求定义特殊命名的函数返回成员的, 不需要set/get。
taodm 2013-02-10
  • 打赏
  • 举报
回复
一个类有很多很多属性,并且还直接get/set,一般就是一个设计上的错误。 当心,不要在错误的问题上探讨正确解。
Unixzii 2013-02-10
  • 打赏
  • 举报
回复
en,用这种方式能节省很多代码,尤其在一个类有很多属性的时候。一个个写很头疼
qq120848369 2013-02-10
  • 打赏
  • 举报
回复
额, 就是生成set/get函数。。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧