2016-08-08 48 views
1

如果我在基类中声明了几个变量,它们将在每个派生类中定义,对吧?我只想在所有派生类中为基类提供一次变量。例如:如何在基类中初始化唯一变量(继承)

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

我该怎么做?

+1

你已经做到了!可能的副本:[私人和受保护的成员](http://stackoverflow.com/q/224966/514235) – iammilind

+2

当你说你想让所有派生类使用相同的fileIndex时,你的实际意思是什么。到目前为止所有的答案都理解它意味着所有的基础,无论它们是否使用继承,都应该使用相同的底层文件索引值。 但似乎你的例子过于复杂的解释。 –

+0

是的,你的意思是你只想在基础中定义这些成员一次,但在每个实例中存储单独的副本(包括派生类 - 标准继承),或者你希望所有实例共享相同的成员('static' )?我建议遵循以下标志说明:_“请澄清您的具体问题或添加其他详细信息以突出显示您所需的内容。由于它目前已写入,因此很难确切地告诉您所要求的内容。请参阅如何寻求帮助以澄清问题这个问题。“_ –

回答

2

只是要fileIndex一个static变量:

static int fileIndex; 

然后,所有来自所有派生类实例将共享相同的值

1

我猜想这是不是在一些全球性的日志文件索引你需要保持整洁。 A 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

如果您需要拥有对象共享状态,则可以通过将状态因子分解为另一个对象来明确它。