2016-08-08 56 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

如果您需要擁有對象共享狀態,則可以通過將狀態因子分解爲另一個對象來明確它。