如何解决是否可以通过其他类中的另一个const静态字段来初始化const静态字段?
我正在尝试从其他文件中不同类的另一个static const
字段的状态(的一部分)初始化const static
字段的状态。
在一个简化的示例中:
// object.h
class Object {
public:
Object(std::string s)
: s(s)
{}
private:
std::string s;
};
// a.h
#include "object.h"
class A {
public:
static const Object o;
};
// a.cpp
#include "a.h"
const Object A::o { "ObjectToCopyFrom" };
// b.h
#include "object.h"
class B {
public:
static const Object o;
}
// b.cpp
#include "a.h"
const Object B::o { A::o };
根据我的经验,我发现B::o
无法从A::o
初始化。它可以编译,但是std::string B::o
为空。我是在做错什么,还是根本不可能?还是对于static const
相互依赖的字段有更好的设计策略?
解决方法
从C ++ 17开始,您可以在相应的 header 文件的类声明中使用inline
成员变量。这样避免了在单个 source 文件中定义这些成员的需要,从而避免了与不同翻译单元的评估顺序有关的任何歧义。
此外,在您给出的示例中,您需要将A::o
设为public
成员,以便B
类使用它(类成员是默认为private
。
以下是可能的“仅标头”解决方案:
// object.h
#include <string>
class Object {
public:
Object(std::string s_arg) // IMHO,using argument names same as members is not a good idea!
: s(s_arg)
{ }
private:
std::string s;
};
// a.h
#include "object.h"
class A {
public: // The "o" member MUST be public in order for the initialization in "B" to work!
static inline const Object o{ "ObjectToCopyFrom" };
};
// b.h
#include "a.h" // Need to include the "a.h" header to get the definition of "class A"
class B {
static inline const Object o{ A::o };
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。