다음과 비슷한 클래스 구조를 디자인하려고합니다. 주요 개념은 필요할 때 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;
}
왜 우리에게 'bla()'를 표시합니까? 아마 이런 'foo (child1) ;->'bla (child1);'에 대한 것이었을까요? 또한 나는 당신의 질문이 무엇인지 이해하지 못합니다. 나는 당신이 당신의 프로그램의 메모리 누출에 대해 묻고 있다고 생각하지 않는다는 것을 의미한다 ... – gsamaras
당신은 * 정말로 * 성취하려고 노력하고 있는가? 이것은 다소 [XY 문제] (http://xyproblem.info)처럼 들립니다. –
@gsamaras 편집을 추가했습니다. 예, 오타였습니다. 나는 bla (child1)을 참조하고 있었다. –