静态成员声明 c++11

Static member declaration c++11

我创建了一个带有静态字段的基本 IBasic 界面

class IBasic
{
public:
    IBasic();
    virtual ~IBasic();

    static std::vector< std::vector<char> > Field;
};

Inherit class 继承自:

class Inherit : public IBasic
{
public:
    Inherit(int);
    ~Inherit();
    void Foo();
};

继承class在constructor/or成员函数中对Field静态成员进行了一些操作。 为了创建Inheritclass的实例,我们需要在main函数之前在main.cpp显式声明一个static字段:

#include "Basic.h"
#include "Inherit.h"

std::vector< std::vector<char> > IBasic::Field;

int main()
{
    Inherit(10);

    return 0;
}

问题是:

  1. 静态方法实际存在于哪个命名空间中(全局?)?因为我知道 static field/function 实际上不是 class 成员。
  2. 是否有另一种方法来声明这个静态方法,例如,在 class 文件,在主函数中,还是通过创建未命名的命名空间?只有一个正确的变体吗?
  3. 怎么样才对?首先应该考虑什么?
  1. In what namespace does the static method actually exists (global?)? Because I know that static field/function is not a class member in fact.

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

  1. Is there another way to declare this static method, for example, in a class file, inside a main function, or through creation unnamed namespace? Is it only one right variant?

通常的方法是在包含class.

函数定义的翻译单元中定义
  1. How is right? What should be considered first of all?

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

class 的静态成员是其 class 的成员(这是重言式)及其 class 命名空间(class 是命名空间)。它不是任何其他名称空间的成员。

class 的非常量静态数据成员必须在程序中定义一次,在任何 class 之外,在同一个命名空间中,它的 class 定义在(在你的例子中是一个全局命名空间)。头文件不适合放置此类声明。它通常放在与头文件一起的实现 .cpp 文件中。

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

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

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;
}

另一个class使用上面的class作为静态成员

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
}

静态成员仍然属于class,但它们有静态存储。