静态成员声明 c++11
Static member declaration c++11
我创建一个带有静态字段的基本IBasic接口
class IBasic
{
public:
IBasic();
virtual ~IBasic();
static std::vector< std::vector<char> > Field;
};
继承类的继承自:
class Inherit : public IBasic
{
public:
Inherit(int);
~Inherit();
void Foo();
};
Inherit 类在构造函数/或成员函数中使用 Field 静态成员进行一些操作。为了创建 Inherit 类的实例,我们需要在 main 函数之前显式声明一个静态字段.cpp:
#include "Basic.h"
#include "Inherit.h"
std::vector< std::vector<char> > IBasic::Field;
int main()
{
Inherit(10);
return 0;
}
问题是:
- 静态方法实际存在于哪个命名空间中(全局?因为我知道静态字段/函数实际上不是类成员。
- 有没有另一种方法来声明这个静态方法,例如,在类文件,在主函数内,还是通过创建未命名的命名空间?它只有一个正确的变体吗?
- 怎么是对的?首先应该考虑什么?
类的静态成员是其类(即重言式)及其类命名空间(类是命名空间)的成员。它不是任何其他命名空间的 nember。
类的非 const 静态数据成员必须在程序中,在任何类之外,在定义其类的同一命名空间中(在本例中为全局命名空间)中精确定义一次。头文件不适合用于此类声明。它通常放置在与头文件一起的实现.cpp文件中。
话虽如此,接口不应该有任何静态数据成员,更不用说公共数据成员了。这很可能是一个严重的设计错误。
- 静态方法实际存在于哪个命名空间中(全局?因为我知道静态字段/函数实际上不是类成员。
它在类的范围内声明。事实上,静态变量是一个类成员,你的假设是错误的。
- 有没有另一种方法来声明这个静态方法,例如,在类文件中,在主函数中,或通过创建未命名的命名空间?它只有一个正确的变体吗?
通常的方法是在包含类的函数定义的翻译单元中定义它。
- 怎么是对的?首先应该考虑什么?
没有正确或错误的方法,但如前所述,与类函数定义相同的翻译单元中的定义是通常的方法。
下面是没有任何继承的静态成员的示例用法。
某类.h
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass {
private:
int x;
public:
static SomeClass* const get(); // Needed For Using class to get this pointer
SomeClass();
int getX() const { return x; }
void setX( int val ) { x = val; }
};
#endif // SOME_CLASS_H
某类.cpp
#include "SomeClass.h"
static SomeClass* s_pSomeClass = nullptr;
SomeClass::SomeClass() {
s_pSomeClass = this;
}
SomeClass* const SomeClass::get() {
if ( nullptr == s_pSomeClass ) {
// throw exception
}
return s_pSomeClass;
}
另一个使用上述类作为静态成员的类
其他类.h
#ifndef OTHER_CLASS_H
#define OTHER_CLASS_H
class SomeClass; // Forward Declaration
class OtherClass {
private:
static SomeClass* pSomeClass; // The Static Member to this class
int y;
public:
OtherClass();
int getY() const { return y; }
void setY( int val ) { y = val; }
void useSomeClassToSetY();
};
#endif // OTHER_CLASS_H
其他类.cpp
#include "OtherClass.h"
#include "SomeClass.h"
SomeClass* OtherClass::pSomeClass = nullptr;
OtherClass::OtherClass() {
if ( nullptr == pSomeClass ) {
pSomeClass = SomeClass::get();
}
}
void OtherClass::useSomeClassToSetY() {
// First Set X To Some Value:
pSomeClass->setX( 10 ); // Use of Static Member
y = pSomeClass->getX(); // Use of Static Member
}
静态成员仍属于类,但它们具有静态存储。
相关文章:
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- C++ 11 通过在类声明中使用指针来节省内存
- 有什么理由C++ 11+ std::mutex 应该声明为全局变量,而不是作为函数参数传递到 std::thread 中
- 如何实现声明功能-C 11,编译时间
- 如何使用 c++11 函数回调声明多个模板参数
- C++11: "decltype(1+2)"声明 xvalue 还是 prvalue?
- 不能和正确的方法来声明类成员 c++11 中的 int 数组数组
- 为什么即使在启用 C++11 并且我包含字符串之后,'stod'仍然没有在此范围内声明?
- 为什么 C++11 允许您将局部变量声明为 thread_local
- C++11 外部作用域变量声明为 auto
- 无法在 c++ 中声明动态整数数组,可能是 c++11 错误
- C++11 - 如何在C++11中做出此Qt声明
- 静态成员声明 c++11
- 使用新的 C++11 语法的 auto 进行函数声明,但使用 auto&并且没有 ->
- 标记C 声明的一种便携式方式,为C 11所接受的弃用
- 声明中的循环依赖性C 11
- 使用 C++11 auto 关键字声明两个(或多个)变量
- 可以在C 11中有条件声明的朋友类
- 有没有办法在声明中缩短C 11 lambda签名
- C++11:模板专用化的 constexpr 成员的标准参考需要额外声明