如何在使用命名空间时在结构本身中定义静态结构成员
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()
当用相同类型的静态成员声明和定义结构时,我似乎无法弄清楚如何定义值。
我有一个包含两个字符串的结构。我希望有一个可以从类型本身访问的 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()