当用相同类型的静态成员声明和定义结构时,我似乎不知道如何定义值。
我有一个包含两个字符串的结构。我希望有一个定义的/恒定的版本,我可以从类型本身访问。为此,我在一个头中声明静态成员,并尝试在类中定义它们。
标题:
//.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");
}
}