2012-04-07 2 views
1

나는 다음과 같은 클래스가 있습니다 컨테이너, 요소 다음 예 요소에서을 상속 클래스의 커플. 컨테이너 배열에 요소를 추가 할 때 버튼, 입력, 등등 ...다형성과 포인터의 배열 (C++)

내가 문제가() 내 주요는 다음과 같습니다

Container c; 
c.Add(Button(...)); 
c.Add(Input(...)); 

는 여기서 "..."일부 생성자입니다 매개 변수.

Element ** elements; 

하지만 데 문제가 Add 메서드를 구현하는 방법이다, 내가 기대했다 무언가 : 컨테이너 클래스에서

는 그 컨테이너에 속하는 모든 요소를 ​​저장하는 포인터의 배열을 다음과 같이 작동합니다 :

void Add(const CControl & newElement){      
    elements[elemCnt++] = &newElement;    
} 

(요소 배열을 할당 : 요소 = 새로운 요소 * [100]) 나는이 컴파일 오류를 얻고있다 그러나

:

main.cpp: In member function ‘Container& Container::Add(const Element&)’: 
main.cpp:138:23: error: invalid conversion from ‘const Element*’ to ‘Element*’ 

const 한정자를 제거하면 적절한 후보가 없다는 컴파일 오류가 발생합니다.

문제는 C++에서 다형성과 상속에 익숙하지 않기 때문에 잘못된 방향으로 진행될 수 있습니다. 이것에 대한 최선의 접근 방법은 무엇입니까?

추신 : 주된 방법은 똑같아 야하며, 벡터 나 STL을 제안하지 않아야합니다. 당신이 정말로 호출 코드를 변경할 수 없다면 당신은 어떻게 든 임시의 복사본을 생성 할 필요가

void Add(CControl * newElement){      
    elements[elemCnt++] = newElement;    
} 

다음이

c.Add(new Button(...)); 
c.Add(new Input(...)); 

처럼 호출 할 수

+0

STL 사용시 문제점은 무엇입니까? 왜 그것을 사용하고 싶지 않아 ??? 인생을 훨씬 쉽게 만들어줍니다. –

+1

여기에서 하나의 중대한 실수를 저지른 것은 _temporary_ 변수의 주소를 사용하고 멀리 저장하는 것입니다. Add에 대한 인수는 일시적이며 호출이 끝나면 객체가 삭제됩니다. 게다가, 나는 TonyTheLion에 동의한다. 왜 아주 좋은 표준 컨테이너를 사용하지 않을까? –

+0

아마도 그럴 것입니다. 요소를 복사하고 동적으로 할당 된 복사본의 주소를 저장해야합니다. STL을 사용하지 않고 환경에서 테스트 한 결과이므로 STL을 사용할 수 없습니다. – Smaug

답변

2

Add 포인터를 취해야한다 . 예. 가상의 Clone 메서드를 CControl에 구현하여 Input, ButtonAdd이라고 부릅니다.

void Add(const CControl & newElement){       
    elements[elemCnt++] = newElement.Clone(); 
} 
+0

'elements [elemCnt ++] = & newElement;는 단지'elements [elemCnt ++] = newElement;'이어야합니다. –

+0

문제는 내가 main()을 가지고 있어야한다는 것입니다 :/ – Smaug

+0

@JoachimPileborg - 답장을 편집했습니다. – Henrik

0

그것은 당신이 임시에 대한 참조를 저장하려고하기 때문에, main을 변경하지 않고이 코드를 수정하는 것은 불가능합니다. 이것은 당신이 무엇을 하든지 원상태로 되돌릴 수 있습니다.