【问题标题】:How to initialize unique variables in base class (Inheritance) [closed]如何初始化基类中的唯一变量(继承)[关闭]
【发布时间】:2016-12-14 01:06:14
【问题描述】:

如果我在基类中声明多个变量,它们将在每个派生类中定义,对吗?我只想为所有派生类拥有一次基类中的变量。示例:

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
};

我该怎么做?

【问题讨论】:

  • 你已经做到了!可能重复:Private and Protected Members
  • 当您说希望所有派生类使用相同的 fileIndex 时,您的实际意思是什么。到目前为止,所有答案都将其理解为所有 Base,无论它们是否使用继承,都应该使用相同的底层 fileIndex 值。但是对于这种解释,您的示例似乎过于复杂。
  • 是的,您的意思是您只想在基础中定义这些成员一次,但在每个实例中存储单独的副本(包括派生 - 沼泽标准继承),还是执行您是否希望所有实例共享相同的成员 (static)?我建议遵循以下标志描述:“请澄清您的具体问题或添加其他详细信息以准确突出您需要什么。正如目前所写的那样,很难准确说出您在问什么。请参阅如何询问页面帮助澄清这个问题。”
  • 我希望所有实例都使用相同的成员(静态)。只有一个文件索引。我想确保所有派生对象都使用基类中的值,一旦定义。

标签: c++ inheritance derived-class


【解决方案1】:

我假设这不是您需要保持整洁的某个全局日志中的文件索引。 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

如果您需要让对象共享状态,则可以通过将状态分解为另一个对象来使其明确。

【讨论】:

    【解决方案2】:

    只需将fileIndex 设为static 变量:

    static int fileIndex;
    

    那么来自所有派生类的所有实例将共享相同的值

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 2012-02-18
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2021-03-09
      相关资源
      最近更新 更多