我创建了一个带有静态字段的基本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函数之前在main.cpp中显式声明一个静态字段:
#include "Basic.h"
#include "Inherit.h"
std::vector< std::vector<char> > IBasic::Field;
int main()
{
Inherit(10);
return 0;
}
问题是:
答案 0 :(得分:5)
类的静态成员是其类的成员(这是一个重言式)及其类命名空间(类是命名空间)。它不是任何其他命名空间的结构。
类的非const静态数据成员必须在程序中完全定义一次,在任何类之外,在其定义的同一名称空间中(在您的情况下为全局名称空间)。头文件不适合此类声明。它通常放在一个实现.cpp文件中,该文件与头文件一起使用。
话虽如此,接口不应该有任何静态数据成员,更不用说公共成员了。这很可能是一个严重的设计错误。
答案 1 :(得分:4)
- 静态方法实际存在于什么名称空间中(全局?)?因为我知道静态字段/函数实际上不是类成员。
醇>
它在类的范围内声明。事实上,静态变量是一个类成员,你的假设是错误的。
- 是否有另一种方法可以声明这个静态方法,例如,在类文件中,在main函数内,还是通过创建未命名的命名空间?它只是一个正确的变体吗?
醇>
通常的方法是在包含类的函数定义的翻译单元中定义。
- 怎么回事?首先应该考虑什么?
醇>
没有正确或错误的方法,但正如上面提到的定义在同一个翻译单元中,类函数定义是通常的方法。
答案 2 :(得分:1)
以下是没有任何继承的静态成员的示例用法。
<强> SomeClass.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
<强> SomeClass.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;
}
使用上面的类作为静态成员的另一个类
<强> OtherClass.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
<强> OtherClass.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
}
静态成员仍然属于该类,但它们具有静态存储。