如果我在基类中声明几个变量,它们将在每个派生类中定义,对吗?我只想让基类中的变量一劳永逸地派生类。示例:
class Base{
public:
virtual ~Base();
protected:
Base();
int fileIndex;
};
class DerivedA : public Base{
public:
DerivedA();
virtual ~DerivedA();
void DoSth(); //using fileIndex
};
class DerivedB : public Base{
public:
DerivedB();
virtual ~DerivedB();
void DoSthDifferent(); //using the same fileIndex
};
我该怎么做?
只需将fileIndex
设为static
变量:
static int fileIndex;
然后,所有派生类中的所有实例都将共享相同的值
我假设这不是某个全局日志中需要保持整洁的文件索引。static
就可以了。
使用组合而不是(滥用(继承。
class FileAccessor
{
int fileIndex;
// Your stuff
};
Class A
{
std::shared_ptr<FileAccessor> mFileAccessor;
public:
A(std::shared_ptr<FileAccessor> fAccesor ) : mFileAccessor(fAccesor ) {}
void DoSth () { /* use mFileAccessor*/ }
};
Class B
{
std::shared_ptr<FileAccessor> mFileAccessor;
public:
B(std::shared_ptr<FileAccessor> fAccesor ) : mFileAccessor(fAccesor ) {}
void DoSth () { /* use mFileAccessor*/ }
};
int main()
{
auto fAccesor = std::make_shared<FileAccessor>();
A a{fAccesor};
B b{fAccesor};
}
这样,如果需要同步访问,则逻辑将保持在FileReader
中。
如果您需要让对象共享状态,那么通过将状态分解到另一个对象中来明确它。