2012-05-15 4 views
2

C++에서 런타임 포인터 지정 문제가 있습니다. 나는 스레드와 스레드 2 멤버와 base 클래스가 있습니다.C++에서 포인터를 사용하여 런타임 다형성

class base { 

    struct base_struct { 
     int a; 
    }; 
    base_struct thread; 
    std::vector<base_struct> threads; 

    void fn() {} 

}; 

derived1하지만 다른 유형의 base로부터 유도와 같은 두 개의 부재 (threadthreads)를 갖는다.

class derived1 : public base { 
    struct derived_struct11 : public base_struct { 
     int b; 
    }; 
    derived_struct11 thread; 
    std::vector<derived_struct11> threads; 

    void fn() { 
     printf(); 
    } 

}; 

derived2 또한 base로부터 유도와 같은 두 개의 부재 (threadthreads)이지만 다른 타입을 갖는다.

class derived2 : public base { 
    struct derived_struct22 : public base_struct { 
     int c; 
    }; 
    derived_struct22 thread; 
    std::vector<derived_struct22> threads; 

    void fn() { 
     printf(); 
    } 

}; 

만 런타임에 나는 derived1 또는 derived2 사용할지 여부를 알 수 있습니다. 그래서 는 다음과 같은 방법으로 그것을했다 :

base base_obj; 
derived1 derived1_obj; 
derived2 derived2_obj; 

base *ptr ; 

런타임 함수에서 :

{ 
    if (condition == yes) 
     ptr = &derived1_obj; 

    else 
     ptr = &derived2_obj; 
} 

문제는 내가 this 포인터 coreectly 기능에 액세스 할 수 있다는 것입니다. .. 스레드 (예를 들어, 값 그러나 : threads.size() 항상 내가 이것을 구현하는 더 좋은 방법을 알고 싶어 base 클래스

의로 표시됩니다

+2

'base :: base_struct'가'private'이므로 컴파일하지 않아야합니다. –

+0

샘플이었습니다. – deeps8us

+3

나쁜 샘플이었습니다. 정확한 코드를 게시하는 것은 매우 중요합니다. 이렇게하면 ** ** 많은 것을 쉽게 할 수 있습니다. –

답변

2

직접 문제를 데이터 멤버는 할 수 없습니다 가상 클래스이므로 파생 클래스에서 threads을 재정의 할 수 없습니다. 하나의 솔루션은 기본 클래스에 threads을 하나만 포함하고 거기에 모든 struct 인스턴스를 저장할 수 있습니다.

그러나 다음과 같은 문제가 발생합니다. 슬라이스 : 개체를 값으로 저장하고 있습니다. s는 std::vector<base_struct>입니다. 즉, 객체를 넣을 때마다 (생성 된) 복사 생성자 base_struct을 사용하여 벡터에 복사됩니다. 즉, 원본 오브젝트의 파생 부분이 분리되어 base_struct 요소 만 나타납니다.

당신이 당신의 벡터에 base_struct에 대한 포인터 만 저장해야 다형성을 사용하려면 :

std::vector<base_struct*> threads; 

또 다른 방법은 다음 원하는 집합을 반환하는 파생 클래스에서 재정의 할 수있는 threads에 대한 가상 게터를 제공하는 것 . 그러나 클래스 계층 구조에 같은 이름을 가진 여러 데이터 멤버가 있으면 IMO는 좋은 생각이 아닙니다. 사람들을 혼란스럽게하고 미묘한 버그를 초래할 수 있습니다. 따라서 각 클래스에 별도의 컬렉션을 유지해야하는 매우 긴급한 이유가없는 한 첫 번째 솔루션을 선호합니다.

+0

고마워요 .. 나는 두 클래스 모두에서 같은 이름의 멤버를 유지할 특별한 이유가 있습니다. 다른 솔루션을 사용해 볼 것입니다. – deeps8us

0

한 가지 방법 주위, 파생 클래스에서 다음

base_struct* thread; 
std::vector<base_struct*> threads; // <- hmmmmmmm 

것이 적절 기본 멤버를 설정 (오히려 파생 클래스에서 두 개의 새로운 멤버를 정의하는 것이 아니라 - 내가 생각 어쨌든 찾고있는 것이 아니다)

관련 문제