편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2020.01.10

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


    //부모 클래스 헤더
    #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()가 없어 추가해서 사용 하려고 하는것..)

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

    질문이 두서없네요.

  • 프로필 김성중님의 편집
    날짜2020.01.10

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


    //부모 클래스 헤더
    #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()가 없어 추가해서 사용 하려고 하는것..)

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

    질문이 두서없네용 ㅠㅠ