静态成员声明 c++11

Static member declaration c++11

本文关键字:c++11 声明 静态成员      更新时间:2023-10-16

我创建一个带有静态字段的基本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;
}

问题是:

  1. 静态方法实际存在于哪个命名空间中(全局?因为我知道静态字段/函数实际上不是类成员。
  2. 有没有另一种方法来声明这个静态方法,例如,在类文件,在主函数内,还是通过创建未命名的命名空间?它只有一个正确的变体吗?
  3. 怎么是对的?首先应该考虑什么?

类的静态成员是其类(即重言式)及其类命名空间(类是命名空间)的成员。它不是任何其他命名空间的 nember。

类的非 const 静态数据成员必须在程序中,在任何类之外,在定义其类的同一命名空间中(在本例中为全局命名空间)中精确定义一次。头文件不适合用于此类声明。它通常放置在与头文件一起的实现.cpp文件中。

话虽如此,接口不应该有任何静态数据成员,更不用说公共数据成员了。这很可能是一个严重的设计错误。

  1. 静态方法实际存在于哪个命名空间中(全局?因为我知道静态字段/函数实际上不是类成员。

它在类的范围内声明。事实上,静态变量是一个类成员,你的假设是错误的。

  1. 有没有另一种方法来声明这个静态方法,例如,在类文件中,在主函数中,或通过创建未命名的命名空间?它只有一个正确的变体吗?

通常的方法是在包含类的函数定义的翻译单元中定义它。

  1. 怎么是对的?首先应该考虑什么?

没有正确或错误的方法,但如前所述,与类函数定义相同的翻译单元中的定义是通常的方法。

下面是没有任何继承的静态成员的示例用法。

某类.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
}
静态

成员仍属于类,但它们具有静态存储。