2016-12-14 3 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){} 
} 

모든 (내가 몇했습니다하는) 그들은 모두 서로 다른, Y를 X를 통과 : 예를 들어

. 그런 다음이 카운터를 호출 할 때이 카운터를 증가 시키길 원합니다.

내가 직면 한 문제는 카운터가 해당 반복에만 증가한다는 것입니다. 어떤 객체도 재구성되지 않습니다 (디버깅 때문에). 클래스 1에 대한 add_counter를 호출하면 1에서 2로 증가하지만 다시 호출하면 동일하게 (1에서 2)됩니다.

무엇이 여기에 있습니까?

감사합니다.

+3

당신이 [mcve] 당신이 가진 문제가있는 코드의 생성시겠습니까? – NathanOliver

+2

클래스 정의 방법을 검토하십시오 : 기본 클래스 {..}가 아니고 클래스 기본 {...}'입니다. 그리고'Derived'가'base'에서 파생되면'class Derived : public base {...} '가됩니다. – Ripi2

답변

1

무엇이 여기에 있습니까?

형식이 Base에서 파생 된 개체의 수를 추적하고 싶습니다.

이 경우 counterstatic 멤버 변수로 만들어야합니다.이 경우 add_counterstatic 멤버 함수로 만들어야합니다. 당신에게 필요하지만

에 :

  1. 감소시킵니다 소멸자의 수입니다.
  2. Base에 복사본 생성자를 추가하여 복사본 생성자를 사용하여 만든 개체도 계산되도록하십시오. 당신이 구축 derived1 개체의 수를 추적하려면

    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; 
    

    , 당신은에 부기 코드를 추가해야합니다 :

여기에 있다고 할 수 base의 단순화 된 버전입니다 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'에 부기 코드를 추가하십시오. 클래스 템플릿을 만들어 해당 프로세스를 간소화 할 수 있습니다. –