2016-12-14 60 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'。您可以创建一个类模板来简化该流程。 –