重写基类中的编译器宏
Override compiler macro in base class
在我的基类 B 中.cpp我有一个宏
#define PRODUCT "MY PRODUCT B"
用于许多输出等。 我现在从 B 派生 D 类,并将宏替换为
#define PRODUCT "NEW PRODUCT D"
有没有办法做到这一点? 它只是归结为编译顺序(随机)吗?
埃德加答案的变体,根据您要完成的任务,可能更合适或更不合适:
class Base {
private:
virtual const std::string Product() const {
return "MY PRODUCT B";
}
};
class Derived {
private:
virtual const std::string Product() const override {
return "MY PRODUCT D";
}
};
如果你的回答比埃德加的更好,我宁愿你赞扬埃德加回答这个问题。
我不认为宏是实现这一目标的可靠方法。
我建议改用静态成员:
class Base {
private:
static const std::string PRODUCT;
};
const std::string Base::PRODUCT = "MY PRODUCT B";
class Derived {
private:
static const std::string PRODUCT;
};
const std::string Derived::PRODUCT = "MY PRODUCT D";
现在,您可以在Base
类和Derived
类中使用PRODUCT
。
为什么在C++中应该避免宏
宏跨越作用域边界,正如示例说明大声报告的那样。
它只是归结为编译顺序(随机)吗?
我从来没有随机编译顺序,但我使用依赖项控制顺序的生成文件。 请注意,您的构建也应该是可重复的。
有没有办法做到这一点?[重新定义宏以仅在需要的地方更改]
可能。。。您能否在定义第二个"#define 产品......"之前可靠地"#undef 产品" 并且不让代码看到您想要第一个定义的第二个定义。
考虑:
在代码中创建两个区域...
#define PRODUCT "MY PRODUCT B"
// zone a
#undef PRODUCT
#define PRODUCT "NEW PRODUCT D"
// zone b
#undef PRODUCT
将与定义相对应并依赖于定义的代码放入相应的区域。
一个解决方案:
我对包含宏的第三方代码感到宏观惊喜,这些代码弄乱了我的符号名称。就好像他们定义了具有常用含义的宏,例如:打开、关闭、读取、写入等。 我的方法"Foo_t::open()"等会被踩踏。
我通过以下方式解决了这个问题(也许很笨拙)
- 仅在一个 cpp 中包含第 3 方标头,这样我确实使用的"宏"仅由我编写的代码调用以使用它,而不是在任何其他编译单元中调用。 (即我通过 #include 控制了引入宏的位置。
和
- 在下面添加一些"高级"的C ++方法,其中包括,这是使用宏的代码。 这些"更高级"的 c++ 方法是在 hpp 中声明的,并在 cpp 中定义。 其他代码使用这些方法...我想在某种意义上我"包装"了宏。
相关文章:
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 如果类包含基类的成员,编译器是否可以利用空基优化?
- 如果类包含基类类型的成员作为第一个元素,后跟其他成员,编译器是否可以优化空基?
- 重写基类中的编译器宏
- 编译器如何处理基类破坏者在派生的破坏者中调用
- 引用基类的 constexpr 构造函数因编译器而异
- 为什么当我有两个函数时编译器没有显示错误,一个将采用基类,一个将派生类作为参数
- 在C++中,为什么编译器不了解基类对象在编译时指向哪个对象?
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- C++编译器可以删除(虚拟)私有基类吗
- C++编译器错误基类问题
- 当基类私有派生时,编译器插入的vptr是否变为私有
- 为什么派生类虚函数可以调用基类虚函数?编译器如何实现
- std::unique_ptr 编译器错误:派生类的成员无法访问基类的私有成员
- 在基类构造函数中使用参数时C++继承编译器错误
- 如果基类和派生类都具有相同的成员变量,编译器如何解析要调用的成员
- 当基类指针指向基类对象时,编译器是否将使用动态绑定
- 为什么编译器在模板参数列表中选择基类构造函数
- 模板基类成员出现g++编译器错误
- 编译器在这段代码中做了什么(派生类对象的基类指针)