如何在使用命名空间时在结构本身中定义静态结构成员

How to define static struct member in the struct itself while using namespaces

当用相同类型的静态成员声明和定义结构时,我似乎无法弄清楚如何定义值。

我有一个包含两个字符串的结构。我希望有一个可以从类型本身访问的 defined/constant 版本。为此,我在 header 中声明静态成员并尝试在 class.

中定义它们

Header:

//.h
#pragma once
#include "BaseStruct.h"
#include<string>

namespace A {
    namespace B{
        struct MyStruct : A::C::BaseStruct
        {
            MyStruct(std::string s1, std::string s2);
            static MyStruct myStaticStruct;
        };
    }
}

Class:

//.cpp
#include "BaseStruct.h"
#include "MyStruct.h"

namespace A {
    namespace B {
        struct MyStruct : A::C::BaseStruct
        {
            MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2)
            {}
        };        

// I have been trying to define MyStaticStruct here.

    }
}

如何定义在header中声明的静态成员? 我无法使用以下方法访问静态成员:

MyStruct::MyStaticStruct

但我必须使用:

A::B::MyStruct::MyStaticStruct

为什么即使我在 A::B 命名空间内也无法访问静态成员?当然,如何为该成员定义值?

.cpp 文件中删除 class 定义,只在其中实现成员函数 - 并初始化您的 static 变量:

.cpp

namespace A {
    namespace B {
        // member functions
        MyStruct::MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2) {}

        // static variables
        MyStruct MyStruct::myStaticStruct("foo", "bar");
    }
}

您不应该在您的 cpp 文件中重新声明您的 class,只需定义您的方法和静态成员:

namespace A {
    namespace B {
            MyStruct::MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2)
            {}

            MyStruct MyStruct::myStaticStruct("s1", "s2");
    }
}

请注意,您可能会很快 运行 使用此方法进入静态初始化顺序失败。更好的选择是使用一个函数来检索你的单例:

#include<string>

namespace A {
    namespace C{
        struct BaseStruct{
            BaseStruct(std::string s1, std::string s2) {};
        };
    }
    namespace B{
        struct MyStruct : A::C::BaseStruct
        {
            MyStruct(std::string s1, std::string s2);
            static MyStruct& myStaticStruct();
        };
    }
}

namespace A {
    namespace B {
            MyStruct::MyStruct(std::string s1, std::string s2) : BaseStruct(s1, s2)
            {}

            MyStruct& MyStruct::myStaticStruct()
            {
                static MyStruct singleton("s1", "s2");
                return singleton;
            }
    }
}

单例在您第一次调用时延迟初始化 myStaticStruct()