我有一个变量,我希望在cpp文件中声明它,而不是头文件。它应该只能被该类的对象访问。这个变量应该为该类的每个对象分别拥有一份独立的副本。继承不是必需的。
通常,我会在类定义中声明它。
A.h:
class A {
private:
int number;
}
但是,我可以这样做吗?
B.h:
class B {
private:
// nothing
}
B.cpp:
static int number;
我有一个变量,我希望在cpp文件中声明它,而不是头文件。它应该只能被该类的对象访问。这个变量应该为该类的每个对象分别拥有一份独立的副本。继承不是必需的。
通常,我会在类定义中声明它。
A.h:
class A {
private:
int number;
}
class B {
private:
// nothing
}
B.cpp:
static int number;
如果您的目标是隐藏实现细节,让客户端只能看到您的头文件(可能是为了保密,或者避免依赖库内部实现细节),那么您寻找的设计模式是 pimpl
模式(“指向实现的指针”)。
myclass.h:
class MyClassImpl;
class MyClass
{
public:
MyClass();
~MyClass();
int someFunc();
private:
MyClassImpl * pimpl;
}
myclass.cpp:
class MyClassImpl
{
public:
MyClassImpl();
int someFunc();
private:
// whatever members you actually need
}
MyClass::MyClass()
{
pimpl = new MyClassImpl();
}
MyClass::~MyClass()
{
delete pimpl;
}
int MyClass::someFunc()
{
return pimpl->someFunc();
}
// go on implementing MyClassImpl as you would have implemented MyClass
注意: 此示例代码没有正确的复制语义。您可能希望使用智能指针,或实现适当的复制构造函数/赋值运算符。
使用私有实现模式,可以在cpp文件中隐藏数据成员。
该模式可以使代码更加安全并且易于维护。//a.hpp
struct AData;
class A
{
public:
A();
private:
AData* data_members;
};
//a.cpp
struct AData
{
int number;
};
A::A(): data_members(new AData()) {}
不确定只使用一个整数是否值得。但这可以用于减少编译时间:您可以随意修改A的“数据成员”和实现,而无需重新编译包括a.hpp在内的文件。
此外,最好使用适当的智能指针而不是简单指针(具有适当的复制行为并且可以声明为不完整类型)。
This variable should have a separate copy for every object of that class.
保持静态不会让你实现这个目标。它将成为所有实例共享的一个副本。
如果你想让每个对象都有自己的number
副本,那么你就需要将它作为你类的成员。