2013-02-04 3 views
0

C++에서 머리를 감싸려고합니다. 난 단지 당신에게 복잡한 것들을 만들지 않고 아이디어를 설명하는 데 도움이 작은 조각을 줄거야. Btw,이 메서드 만 구현하면 설정이나 매개 변수를 변경할 수 없습니다.타입 포인터가있는 C++ 함수 호출, 매개 변수 혼동 : 불완전한 타입이 허용되지 않습니다.

typedef class Stock ArrayType; 

class DynamicArray { 
    ArrayType** items; 
    int numberOfElements; 
    ... 
} 

여기 생성자입니다 :

나는라는 객체의 주식을 보유하고 동적 배열에 대한 클래스가 있습니다. 배열을 할당하고 하나의 항목을 추가 한 다음 요소 수를 설정해야합니다.

DynamicArray::DynamicArray(ArrayType* const item){ 
    Stock *items = NULL; // ... i guess? pointers to pointers confuse me 
    // now im guessing i need to create a actual stock array and point the above pointer to it 
    items = new Stock[1]; // ERROR: incomplete type is not allowed? I've tried several things, and cant get rid of the red squiggles 
    this->numberOfElements = 1; 
} 
+1

동적 배열 앞에 Stock 클래스를 정의 해보십시오. 이전에 비슷한 오류가 발생했는데 문제는 문자 그대로 컴파일러가 당시 개체의 완전한 정의를 갖고 있지 않다는 것입니다. –

+0

내가 포함하는 순서를 바꿨지 만 여전히 주스가 없습니다. 어쨌든 제 선생님이 제공 한 코드 부분에 닿으면 안됩니다. – SomeRandomDeveloper

+0

생성자에서'Stock * items'을'Stock * items []'로 바꾼다. –

답변

1

그래, 몇 가지 문제가 있습니다. 박쥐를 없애려면 먼저 주식을 포함해야합니다. 컴파일러는 내 생각에 의한 메모리 할당 때문에 DynamicArray을 컴파일하기 전에 Stock의 전체 정의가 필요합니다.

둘째, items멤버 값에 생성자에서 생성 된 배열에 대한 참조가 포함되기를 원합니다. 따라서 Stock *items[1]을 생성자에 정의하는 대신 에 new 문을 직접 할당하십시오. 어떤 함수를 사용해도 같은 이름의 변수를 정의하지 않는 한 this->을 사용할 수 있습니다.

마지막으로, 포인터의 배열을 할당하고, 그래서 당신이 구문을 사용합니다 단지 코딩 사례 지점으로, 또한 new ArrayType*[1]

을, 당신은 구조체에는 그들의 원래의 사용을 혼합하지 말아야 동일한 출처의 유형. 따라서 전체적으로 ArrayType을 사용하는 것이 좋습니다.

+0

감사합니다. 그게 효과가 : "this-> items = new ArrayType * [1]; items [0] = item;". "ArrayType * items [1]; items [0] = item;"과이 차이점을 잘 모르겠다. – SomeRandomDeveloper

+0

스택 대 힙 할당. 스택에 할당 된 어떤 것이 범위를 벗어나면 가비지 수집됩니다. 힙에 할당 된 무언가는 명시 적으로 해제 될 때까지 계속 붙어 있습니다. 배열의 공간이 미리 할당되고 스택에 할당 된 변수를'삭제 '할 수 없기 때문에 기능적으로이 경우'items'의 크기를 조정할 수 없습니다. –