在我的基类B.cpp中我有一个宏
#define PRODUCT "NEW PRODUCT D"
用于多个输出等。我现在从B派生出D类,并用
代替宏awk
有办法做到这一点吗?它只是归结为编译顺序(随机)吗?
答案 0 :(得分:2)
埃德加答案的变体,根据你想要完成的事情,这可能更合适或更不合适:
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";
}
};
如果你的回答比埃德加好,我宁愿让埃德加回答这个问题。
答案 1 :(得分:1)
我认为宏不是实现这一目标的可靠方法。
我建议使用静态成员:
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";
现在,您可以在PRODUCT
和Base
课程中使用Derived
。
答案 2 :(得分:0)
为什么要在C ++中避免使用宏
宏跨越范围边界,正如您的示例描述大声报告。
它只是归结为编译顺序(随机)吗?
我从来没有随机编译顺序,但我使用makefiles,其中依赖项控制顺序。请注意,您的构建也应该是可重复的。
有办法做到这一点吗? [重新定义宏以仅在需要时进行更改]
可能......你能可靠吗" #undef PRODUCT"就在定义第二个" #define PRODUCT ..."之前并且没有您想要第一个定义的代码所见的第二个定义。
考虑:
在代码中创建两个区域......
#define PRODUCT "MY PRODUCT B"
// zone a
#undef PRODUCT
#define PRODUCT "NEW PRODUCT D"
// zone b
#undef PRODUCT
将与定义相对应的代码放入适当的区域。
一个解决方案:
我的第三方代码包含与我的符号名称相混淆的宏,我感到非常惊讶。它好像已经定义了具有常用含义的宏,如:open,close,read,write等。我的方法" Foo_t :: open()"等等会被踩到。
我通过
解决了这个问题(也许是笨拙的)和