2017-09-22 5 views
0

다음과 비슷한 클래스 구조를 디자인하려고합니다. 주요 개념은 필요할 때 Base 클래스 포인터를 업데이트해야한다는 것입니다. 비슷하게, 우리는 자식 클래스에 대해 무관 한 연산을 가질 수있다.하위 클래스에서 기본 클래스에 대한 포인터를 포함하는 방법

다형성과 캡슐화가 어떻게 재 설계되어야하는지 궁금합니다. 그것은 매우 멍청한 질문 일지 모르지만 어떤 도움을 주셔서 감사합니다.

실제 코드에서이 코드를 사용하는 곳에서 메모리 누수가 걱정되는 것은 아닙니다. 문제가 발생하지 않도록 삭제가 수행되고 있습니다.

내가 물어보고 싶은 것은 아래와 같이 클래스 구조를 유사하게 만드는 더 좋은 방법입니다. Child1이 getBase를 호출하여 Base 클래스 포인터를 얻는 대신 기본 클래스를 확장 할 수 있습니다. 이미 인스턴스화되고 child1은 단순히 캡슐화하고 그 위에 일부 기능을 제공합니다.

class Base { 
private: 
    int a; 
    char b; 
public: 
    Base(int argA, char argB): a(argA), b(argB) { 
    } 


    char getChar() { 
     return b; 
    } 

    int getInt() { 
     return a; 
    } 

    void setChar(char foo) { 
     b = foo; 
    } 

    void setInt(int foo) { 
     a = foo; 
    } 
}; 

class Child1 { 
private: 

    Base *base; 
public: 
    Child1(PhysicalBlock *argBase) : base(argBase) { 

    } 

    Base *getBase() { 
     return base; 
    } 

    uint64_t getSum() { 
     int a = base->getInt(); 
     char b = base->getChar(); 
     return a + (int)b; 
    } 
}; 

class Child2 { 
private: 
    Base * base; 
    double c; 
public: 
    Child2(Base * argBase) : base(argBase), c(0.0) { 

    } 

    Base *getBase() { 
     return base; 
    } 

    double getDivision() { 
     int a = base->getInt(); 
     char b = base->getChar(); 

     return (double) ((double)a + (double)b)/c; 
    } 
}; 

int bla(Child1 * c1) 
{ 
    Base * b1 = c1->getBase(); 
    b1->setInt(55); 
    b1->setChar('z'); 
    return c1->getSum(); 
} 

int main() 
{ 
    Base * b1 = new Base(1, 'a'); 
    Base * b2 = new Base(2, 'b'); 

    Child1 * child1 = new Child1(b1); 
    Child2 * child2 = new Child2(b2); 

    bla(child1); 

    return 0; 
} 
+2

왜 우리에게 'bla()'를 표시합니까? 아마 이런 'foo (child1) ;->'bla (child1);'에 대한 것이었을까요? 또한 나는 당신의 질문이 무엇인지 이해하지 못합니다. 나는 당신이 당신의 프로그램의 메모리 누출에 대해 묻고 있다고 생각하지 않는다는 것을 의미한다 ... – gsamaras

+0

당신은 * 정말로 * 성취하려고 노력하고 있는가? 이것은 다소 [XY 문제] (http://xyproblem.info)처럼 들립니다. –

+0

@gsamaras 편집을 추가했습니다. 예, 오타였습니다. 나는 bla (child1)을 참조하고 있었다. –

답변

0

당신이 Child을 의미하는 생각은 base class 예에서 derived class입니다 :

class Base{ 
    // some stuff here 
}; 

class Child : public Base{ 
    // some code here 
}; 

이제 아이가 정말 클래스 자료의 자식입니다. 자식은 public 또는 private 또는 protected을 각각 상속받을 수 있으므로 OOP 장의 유익한 유용한 책을 읽으십시오.

  • 위 예제에서 나는 Is-a relationship을 얻었습니다. 그래서 당신은 말할 수 있습니다 : a man is a human, a dog is an animal....

  • 예제에서는 has-a relationship을 얻고 있습니다. 따라서 예제 클래스에서 자식 has은 기본 클래스의 개체입니다. `봉쇄 (containment) '라고 말할 수 있습니다.

  • 파생 클래스에 기본 클래스의 개체를 포함 할 필요가 없다고 생각합니다. 예 : 하나를 포함 할 필요가 없습니다 있도록

    class Base{}; 
    class Derived : protected Base{ 
        Base* pBase; // I don't think you need this. 
    }; 
    
  • 당신은 (공공 보호) 형태가 파생 된 기본 멤버에 액세스 할 수 있습니다.