静态成员声明c ++ 11

时间:2017-10-23 08:30:24

标签: c++ c++11 inheritance static-members

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

问题是:

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

3 个答案:

答案 0 :(得分:5)

类的静态成员是其类的成员(这是一个重言式)及其类命名空间(类是命名空间)。它不是任何其他命名空间的结构。

类的非const静态数据成员必须在程序中完全定义一次,在任何类之外,在其定义的同一名称空间中(在您的情况下为全局名称空间)。头文件不适合此类声明。它通常放在一个实现.cpp文件中,该文件与头文件一起使用。

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

答案 1 :(得分:4)

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

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

  
      
  1. 是否有另一种方法可以声明这个静态方法,例如,在类文件中,在main函数内,还是通过创建未命名的命名空间?它只是一个正确的变体吗?
  2.   

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

  
      
  1. 怎么回事?首先应该考虑什么?
  2.   

没有正确或错误的方法,但正如上面提到的定义在同一个翻译单元中,类函数定义是通常的方法。

答案 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
}

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