C++ 부모 클래스 멤버 변수 자식 클래스에서 사용하기

조회수 3021회
//부모 클래스 헤더
#pragma once

#include <iostream>

class Base {
public:
    struct StructTest;

    Base();
    ~Base();

    int GetDataX();
    StructTest* GetStruct();
private:
    StructTest* Test;
};
//부모 클래스 소스
#include "Base.h"

struct Base::StructTest
{
    StructTest();
    int x;
    int y;
};

Base::StructTest::StructTest() {
    x = 10;
    y = 20;
}

Base::Base() : Test(NULL){
    std::cout << "Called Base()" << std::endl;
    Test = new StructTest();
}

Base::~Base() {
    std::cout << "Called ~Base()" << std::endl;
}

int Base::GetDataX() {
    return Test->x;
}

Base::StructTest* Base::GetStruct() {
    return Test;
}
// 자식 클래스 헤더
#pragma once
#include "Base.h"

class Child : public Base {
public:
    Child();
    ~Child();
private:
    //Base* base;
    StructTest* childTest;
};
//자식 클래스 소스
#include "Child.h"

Child::Child() {
    std::cout << "Called Child()" << std::endl;
}

Child::~Child() {
    std::cout << "Called ~Child()" << std::endl;
    std::cout << Base::GetDataX() << std::endl; //정상작동
    childTest = Base::GetStruct();
    std::cout << childTest->y << std::endl; //오류 메시지 : 불완전한 클래스 형식에 대한 포인터는 사용할 수 업습니다.
}
// 메인 소스
#include "Child.h"

int main() {

    Child child;

    return 0;
}

질문드려요.

오픈 라이브러리를 사용해서 기능을 추가하려고 하는데요. 부모 클래스가 오픈 라이브러리 입니다.

될 수 있으면 부모 클래스 동작은 그대로 두고 부모 클래스의 필요한 정보만 빼내서 필요한 정보로 특정 기능만 추가하려고 하는데요. 될 수 있으면 오픈 라이브러리를 수정안하고 사용하려합니다. (오픈 라이이브러리 수정 안하던가, 수정 최소화)

그래서 필요한 정보만 빼내는 함수를 부모클래스에 추가해서 자식클래스에서 사용하려하는데, 부모클래스->멤버 구조체->멤버 변수를 갖고 오는거는 되는데 부모클래스->멤버 구조체 자체를 가져오는 것은 잘안되네요.

부모 클래스의 구조체를 포인터로 관리하는데 이것을 수정하면 안됩니다. (오픈 라이브러리 전체를 수정해야됨.)

private:
    StructTest* Test;

더이상 아이디어가 안떠올라서 질문드려요.

아 그리고 오픈 라이브러리를 자체를 수정안하고 저런 식으로 사용하는 다른 방법이 있나요?? (현재 질문 코드는 오픈 라이브러리 자체에 Getter()가 없어 추가해서 사용 하려고 하는것..)

사용하고자 하는 취지는 부모클래스가 생성되면 자동으로 기능을 수행하고 바로 소멸호출 되게 됩니다. 그래서 부모 클래스 소멸자 호출되기 전에 마지막 부모클래스의 구조체 정보를 갖고 기능을 추가하려고, 상속받아서 자식 클래스의 소멸자에서 기능을 구현하려합니다.

질문이 두서없네요.

  • private 으로 선언되어 있으니 접근 못하는 겁니다. 부모 클래스에 Getter 를 추가하던지 friend 를 추가하는 두가지 방법이 있겠습니다만 둘 다 부모 클래스를 수정해야 합니다. 만약 private 를 부모쪽 수정없이 우회해서 접근할 수 있다면 private 키워드 존재 이유가 없겠죠. 정영훈 2020.1.10 15:23

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)