在C ++中,我正在使用一个宏,我需要定义两个变量,第一个应该具有与定义它的范围相同的公共/私有/受保护状态,而另一个应该明显是私有的。但是,如果我这样做:
#define my_macro(a, b) int a;\
private: int b;
然后我永久改变了范围!这个不好。所以我想知道:有没有办法说:“只有这个变量/成员/方法/类是私有的”?
我天真地尝试过像
这样的事情class my_class
{
public:
int i;
private int j;
};
但没有运气。有没有办法得到我需要的东西?
编辑:我不确定定义宏的范围是公开的。正如我所说的那样,“ [...]第一个应该具有与定义它的范围相同的公共/私有/受保护状态”,因此公共或私人或受保护,取决于范围。
答案 0 :(得分:6)
不,没有。但是有一些解决方法:
将变量限制为从中继承的基类,并在那里使用宏。 (使用protected
而非private
)。
使用内部struct
采用与(1)类似的技巧。
做实用的事情并让宏设置第一个或最后一个成员块。
根本不要使用宏,因为它们通常是颈部疼痛。
答案 1 :(得分:2)
语言中没有内置功能可以做到这一点。在push
和pop
之间没有warning
和Object obj = ...; // The object sent over the stream
if(obj instanceof String) {
String str = (String) obj; // Cast it to String
...
} else if(obj instanceof Integer) {
Integer i = (Integer) obj; // Cast it to Integer
...
}
设置,在某些编译器上有预处理器的其他方面。
更大的问题是为什么?你声明了类'骨架,以后很少改变它。这不值得努力。此外,它会使代码的可读性降低,维护也很复杂。
不要浪费你的时间。我不会高效或有用。
答案 2 :(得分:1)
好吧,如果您认为“默认”范围是公开的,您可以随时将宏更改为:
#define my_macro(a, b) int a;\
private: int b; \
public:
甚至:
#define my_macro(a, b) \
private: int b; \
public: int a;
或者,如果您不确定默认范围是什么,您可以随时将其添加为宏参数:
#define my_macro(scope, a, b) int a;\
private: int b; \
scope: