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



当用相同类型的静态成员声明和定义结构时,我似乎不知道如何定义值。

我有一个包含两个字符串的结构。我希望有一个定义的/恒定的版本,我可以从类型本身访问。为此,我在一个头中声明静态成员,并尝试在类中定义它们。

标题:

//.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;
};
}
}

类别:

//.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.
}
}

如何定义在标头中声明的静态成员?我无法使用访问静态成员

MyStruct::MyStaticStruct

但我必须使用:

A::B::MyStruct::MyStaticStruct

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

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

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()时,singleton会延迟初始化

.cpp文件中删除类定义,只在那里实现成员函数,并初始化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");
}
}

最新更新