C++ 静态成员声明c++;11
我创建了一个带有静态字段的基本IBasic接口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
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。谢谢分享你的经验