有没有办法从另一个 class 中的另一个常量静态字段初始化一个常量静态字段?
Is there a way to initialize a const static field from another const static field in a different class?
我正在尝试从不同文件中不同 class 的另一个 const static
字段的(部分)状态初始化我的 static const
字段的状态。
在一个简化的例子中:
// 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 开始,您可以使用 inline
成员变量 - 在 class 声明 - 在相应的 头 个文件。这避免了在单个 source 文件中定义这些成员的需要,从而避免了与不同翻译单元的评估顺序相关的任何歧义。
此外,在您给出的示例中,您需要使 A::o
成为 public
成员,以便 B
class使用它(class 成员默认为 private
)。
这里有一个 'header-only' 可能解决您的问题的方法:
// 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 };
};
我正在尝试从不同文件中不同 class 的另一个 const static
字段的(部分)状态初始化我的 static const
字段的状态。
在一个简化的例子中:
// 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 开始,您可以使用 inline
成员变量 - 在 class 声明 - 在相应的 头 个文件。这避免了在单个 source 文件中定义这些成员的需要,从而避免了与不同翻译单元的评估顺序相关的任何歧义。
此外,在您给出的示例中,您需要使 A::o
成为 public
成员,以便 B
class使用它(class 成员默认为 private
)。
这里有一个 'header-only' 可能解决您的问题的方法:
// 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 };
};