C++ 静态成员声明c++;11

C++ 静态成员声明c++;11,c++,c++11,inheritance,static-members,C++,C++11,Inheritance,Static Members,我创建了一个带有静态字段的基本IBasic接口 class IBasic { public: IBasic(); virtual ~IBasic(); static std::vector< std::vector<char> > Field; }; Inherit类对构造函数/或成员函数中的字段静态成员进行一些操作。 为了创建继承类的实例,我们需要在main.cpp中的main函数之前显式声明一个静态字段: #include "Basic.h

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

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

    static std::vector< std::vector<char> > Field;
};
Inherit类对构造函数/或成员函数中的字段静态成员进行一些操作。 为了创建继承类的实例,我们需要在main.cpp中的main函数之前显式声明一个静态字段:

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

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

int main()
{
    Inherit(10);

    return 0;
}
#包括“Basic.h”
#包括“Inherit.h”
std::vectorIBasic::Field;
int main()
{
继承(10);
返回0;
}
问题是:

  • 静态方法实际存在于哪个命名空间中(全局?)?因为我知道静态字段/函数实际上不是类成员
  • 是否有其他方法来声明此静态方法,例如,在 类文件,在主函数内,还是通过创建未命名的命名空间?它只是一个正确的变体吗
  • 这是怎么回事?首先应该考虑什么
  • 静态方法实际存在于哪个命名空间中(全局?)?因为我知道静态字段/函数实际上不是类成员
  • 它在类的作用域中声明。事实上,静态变量是类成员,您的假设是错误的

  • 是否有其他方法来声明此静态方法,例如,在类文件中、在主函数中或通过创建未命名的命名空间?它只是一个正确的变体吗
  • 通常的方法是在包含类的函数定义的翻译单元中定义它

  • 这是怎么回事?首先应该考虑什么

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

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

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


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

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

    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
    
    #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
    
    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;
    }
    
    #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
    }
    
    另一个将上述类用作静态成员的类

    OtherClass.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
    
    #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 "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;
    }
    
    #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
    }
    

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

    一,。在类名命名空间中。2.您可以在任何.cpp文件中声明static。3.我认为最好是在Basic.cpp中声明static。@Unick答案就在下面,在codeCorrect中没有static方法,首先它不是接口,只是基类,其次我将它更改为protected。谢谢分享你的经验