有没有办法从另一个 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 };
};