2016-12-14 159 views
0

我正面臨着少數繼承類及其基類的問題。在C++中更改基類的值

例如:

base class{ 

int x,y; // Doesnt really matter 
int counter; 

public: 

class(int x, int y):x(x), y(y), counter(1){} 

void add_counter(){counter++;} 
//stuff 
virtual ~base(){} 
} 



class1:public base{ 

public: 

class1():base(1,2){} 
} 

每次我繼承類的(我已經幾個),他們都通過不同的X,Y彼此。然後,當我打電話時,我希望這個計數器增加。

我面臨的問題是計數器僅在該迭代中增加。沒有對象正在重構(因爲我調試過)。如果我爲class1調用add_counter,它將從1增加到2,但如果我再次調用它,它將是相同的(1到2)。

我在這裏錯過了什麼?

謝謝。

+3

能否請您創建一個[MCVE]您有一個問題的代碼? – NathanOliver

+2

回顧一個類是如何定義的:它不是'基類{..}',而是'基類{...}'。如果'Derived'派生自'base',那麼'派生類:public base {...}'。 – Ripi2

回答

1

我在這裏錯過了什麼?

在我看來,你想跟蹤構建的對象的數量,其類型來自Base

在這種情況下,您需要製作counter a static成員變量,這將需要您使add_counter成爲static成員函數。

然而,這將要求您:

  1. 遞減在析構函數的計數。
  2. Base中添加一個拷貝構造函數,以確保使用拷貝構造函數創建的對象也被計數。

這裏是base的簡化版本做到這一點:

class base 
{ 
    public: 

    base() { inrement_counter(); } 

    base(base const& copy) { inrement_counter(); } 

    virtual ~base(){ decrement_counter(); } 

    private: 

    static int counter; 
    static void inrement_counter() {++counter;} 
    static void decrement_counter() {--counter;} 
} 

int base::counter = 0; 

如果你想跟蹤構建derived1對象的數量,你需要的簿記代碼添加到derived1。您可以創建一個類模板來簡化該流程。

例子:

template <typename T> 
struct ObjectCounter 
{ 
    ObjectCounter() { inrement_counter(); } 

    ObjectCounter(ObjectCounter const& copy) { inrement_counter(); } 

    virtual ~ObjectCounter(){ decrement_counter(); } 

    static int counter; 
    static void inrement_counter(){++counter;} 
    static void decrement_counter(){--counter;} 
}; 

template <typename T> 
int ObjectCounter<T>::counter = 0; 

class base 
{ 
}; 

class derived1 : public base, public ObjectCounter<derived1> 
{ 
}; 

class derived2 : public base, public ObjectCounter<derived2> 
{ 
}; 

#include <iostream> 

int main() 
{ 
    derived1 d1; 
    derived2 d2; 
    auto d3 = d2; 

    std::cout << d1.counter << std::endl; 
    std::cout << d2.counter << std::endl; 
} 

輸出:

1 
2 
+0

那麼,事實上,我有一個計數器,它不是爲了創建對象而是爲了別的。比方說,我有基類和繼承1,繼承2 ....等等。所有這些繼承者都有自己的x和y(這就是爲什麼它在基礎中),但我也有另一個變量存在於所有的繼承類中(例如計數器),我想獨立地增加或減少它。我不知道這樣做的方法。它不是針對每個構建的對象。我只有1個繼承構造的對象,我希望能夠改變這個計數器(這是在基地)。謝謝!! – Miguel

+0

@MiguelRuivo,你不能那樣做。基類不能有'derived1'的一個變量,'derived2'的第二個,'derived3'的第三個,等等。如果你想跟蹤被構造的'derived1'對象的數量,你需要將記帳代碼添加到'derived1'。您可以創建一個類模板來簡化該流程。 –