2010-05-21 6 views
19

C++에서는 후자의 다른 객체를 가리킬 수 있도록 포인터 배열을 원한다면 구문이 어떻게 생겼는지 알 수 있습니다.포인터의 C++ 배열

편집 나는 내가 생각하는 것을 시도하고있는 무슨 명확히 할 필요가있다. 클래스 foo 가지고 있고 메서드를 추가 할 수 있습니다. add 메소드에서 나는 클래스 바를 참조한다. 그 참조를 bar의 포인터 배열에 저장하고 싶습니다. 포인터 막대 배열은 항상 문제가없는 확장됩니다. 포인터의 힙에 만들고 배열하기 때문에 나중에 bar 객체를 할당 할 수 있습니다. 클래스 바에 컴파일러가 불평하는 기본 생성자가 없기 때문에 나는 실패한 것으로 보인다. 이것은 내가하고 싶지 않았던 실제 대상물을 만들어 내고 있다고 생각하게했습니다.

제발, 제발 당신이 어떻게 생각하는지 듣고 싶지 않아요. 미치겠습니다. 그게 당신 의견이에요.

+1

이 질문에 엄격하게 대답하지는 않지만 대부분의 경우 포인터 배열을 사용하는 것이 좋습니다. 예 : std :: vector 컬렉션; –

+0

"foo 객체의 실제 초기화 없음"이란 무엇입니까? 또한 컴파일 시간 자체에서 배열의 요소 수를 알 수 있습니까? – Naveen

+0

지금까지 어떤 코드를 제작 했습니까? – Default

답변

6

예를 들어, int 포인터의 배열을 원하면 int* a[10]이됩니다. 변수 a은 10 int*의 모음임을 의미합니다. 당신이 원하는 것은

class Bar 
{ 
}; 

class Foo 
{ 
public: 

    //Takes number of bar elements in the pointer array 
    Foo(int size_in); 

    ~Foo(); 
    void add(Bar& bar); 
private: 

    //Pointer to bar array 
    Bar** m_pBarArr; 

    //Current fee bar index 
    int m_index; 
}; 

Foo::Foo(int size_in) : m_index(0) 
{ 
    //Allocate memory for the array of bar pointers 
    m_pBarArr = new Bar*[size_in]; 
} 

Foo::~Foo() 
{ 
    //Notice delete[] and not delete 
    delete[] m_pBarArr; 
    m_pBarArr = NULL; 
} 

void Foo::add(Bar &bar) 
{ 
    //Store the pointer into the array. 
    //This is dangerous, you are assuming that bar object 
    //is valid even when you try to use it 
    m_pBarArr[m_index++] = &bar; 
} 
+0

복사 연산자를 구현하는 것을 잊지 마시고 ([개인 규칙으로 선언] (http://stackoverflow.com/q/4172722) 참조). – basic6

46

을 :

Foo (*array)[10]; // pointer to array of 10 Foos 
:

Foo *array[10]; // array of 10 Foo pointers 

하지 않음 혼동 편집

나는이 당신이 원하는 무엇을 추측

어떤 경우에도 자동으로 초기화되는 것은 푸로 (Foos) 포인터가 아직 무언가 (예 :. 새로운).

마침내 C에서 포인터/배열 선언 구문을 가져 왔는데 기본 형식에 액세스하는 방법을 알았습니다. Foo *array[5][10];*array[0..4][0..9] (5 개 항목의 배열에 아래 첨자, 10 개 항목의 배열에 아래 첨자, 포인터로 비 참조 함)가 Foo 객체에 액세스한다는 것을 의미합니다 ([]*보다 우선 순위가 높음).

이것은 거꾸로 보입니다. int array[5][10]; (a.k.a. int (array[5])[10];)은 10 int array[5]의 배열이라고 생각할 수 있습니다. 이것을 가정 해 봅시다. 그런 다음 array[9][4]이라고 말하면 배열의 마지막 요소에 액세스합니다. 그것도 거꾸로 보지 않습니까? C 배열 선언은 기대하는 배열 식 구성보다는 기본 형식을 가져 오는 방법을 나타내는 패턴이므로 배열 선언과 배열을 사용하는 코드는 플립 플롭 할 필요가 없습니다.

+0

+1 예, C 선언은 실제로 이해할 경우 이해할 수 있습니다. – fredoverflow

+7

향후이 질문에 대한 방문자 :이 선언을 뭔가로 변환하는 [도구] (http://cdecl.org/)를 사용할 수 있습니다 변수를 선언하는 방법을 더 잘 이해하기 위해 영어와 유사한 변수를 사용합니다. – Sumurai8

3

나는이 라인을 따라 뭔가를 할 것이다 :

class Foo{ 
... 
}; 

int main(){ 
    Foo* arrayOfFoo[100]; //[1] 

    arrayOfFoo[0] = new Foo; //[2] 
} 

[1]이 푸 - 객체에 100 포인터의 배열을한다. 그러나 Foo 객체는 실제로 생성되지 않습니다.

[2] 이는 객체를 인스턴스화 할 수있는 방법 중 하나이며, 동시에 배열의 첫 번째 위치에이 객체에 대한 포인터를 저장합니다.

3

당신이 STL을 사용하지 않는 경우는, 다음 코드는 C.

같은 많은 비트
#include <cstdlib> 
#include <new> 

template< class T > 
void append_to_array(T *&arr, size_t &n, T const &obj) { 
    T *tmp = static_cast<T*>(std::realloc(arr, sizeof(T) * (n+1))); 
    if (tmp == NULL) throw std::bad_alloc(__FUNCTION__); 
     // assign things now that there is no exception 
    arr = tmp; 
    new(&arr[ n ]) T(obj); // placement new 
    ++ n; 
} 

T 어떤 POD의 유형이 될 수 있습니다 보인다 포인터를 포함하여.

arrmalloc이 아니라 new[]으로 할당해야합니다.

관련 문제