【问题标题】:Static member declaration c++11静态成员声明 c++11
【发布时间】:2017-10-23 08:30:24
【问题描述】:

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

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

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

继承自Inherit类:

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

Inherit 类在构造函数/或成员函数中使用 Field 静态成员进行一些操作。 为了创建 Inherit 类的实例,我们需要在 main.cpp 中的 main 函数之前显式声明一个静态字段:

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

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

int main()
{
    Inherit(10);

    return 0;
}

问题是:

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

【问题讨论】:

  • 1.在类名命名空间中。 2. 您可以在任何.cpp 文件中声明静态。 3. 我认为最好在 Basic.cpp 中声明静态。
  • @Unick Answers go down there vvvvvvvvvv
  • 你的代码中没有静态方法

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


【解决方案1】:

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

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

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

【讨论】:

  • 正确,首先它不是接口,只是基类,其次我将其更改为受保护的。感谢您分享您的经验
【解决方案2】:
  1. 静态方法实际存在于哪个命名空间中(全局?)?因为我知道静态字段/函数实际上不是类成员。

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

  1. 是否有其他方式来声明此静态方法,例如,在类文件中、在主函数内部,或通过创建未命名的命名空间?它只有一个正确的变体吗?

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

  1. 如何正确?首先应该考虑什么?

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

【讨论】:

    【解决方案3】:

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

    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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2021-06-09
      相关资源
      最近更新 更多