如何初始化基类中的唯一变量(继承)

How to initialize unique variables in base class (Inheritance)

本文关键字:变量 继承 唯一 初始化 基类      更新时间:2023-10-16

如果我在基类中声明几个变量,它们将在每个派生类中定义,对吗?我只想让基类中的变量一劳永逸地派生类。示例:

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中。

如果您需要让对象共享状态,那么通过将状态分解到另一个对象中来明确它。