2016-10-29 2 views
2

저는 C++ (자바 프로그래머)에 익숙하지 않으며 인트로 과정에 대한 숙제를하고 있습니다. 그 목적은 "생성자, 동적 메모리 할당 및 연산자 오버로딩"입니다. 실제로 말하자면, 저는 그 중 하나에 정말로 집착하고 있습니다.C++ dvc에서 포인터에 포인터를 두는 법

2 가지 색상 인 ColorBox와 ColorBox를 만들고 있습니다. 명령에서 ColorBox의 멤버 변수는 int width, int height 및 Color ** 데이터입니다. 내 이해는 데이터가 2D 객체의 Color 객체에 대한 참조를 보유한다는 것입니다.

내 질문 : DVC의 데이터에 대해 일부 유형의 빈 값이나 기본 값을 설정하려면 어떻게해야합니까? 그리고 아무도 이런 종류의 포인터에 대해 괜찮은 글을 쓸 수있는 링크가 있습니까? 배열과 포인터에 일반적인 쓰기 업을 발견했지만 여전히이 문제를 해결하는 데 어려움을 겪고 있습니다.

미리 감사드립니다.

편집 : 나는 아래 코드에서 작동한다고 생각하지만, 여전히 내가하고있는 것을 알지 못한다는 것을 인정할 것이다.

ColorBlock::ColorBlock() 
{ 
    this->width = 0; 
    this->height = 0; 
    Color temp_data[1][1]; 
    this->data = (Color**)temp_data; 
} 
+0

이 컨텍스트에서 "DVC"란 무엇입니까? – Dai

+0

기본값 생성자 – SMI

+0

Ecxellent. Damme Van Claude-Jean에서 J를 어떻게 잃어 버렸는지 궁금합니다. – user4581301

답변

2

빈 값 또는 기본 값을 말하면 변수를 안전한 기본 상태로 초기화한다고 가정합니다. 이 경우, 제시 한 코드는 다소 정확하지만 일부 작업을 사용할 수 있습니다. 시작하려면

, 당신은 여기에 가장 중요한 변화는 당신이 정크 데이터 대한 데이터를 더 이상 포인트를 생성하지 않는다는 것이다 다음

ColorBlock::ColorBlock() 
{ 
    this->width = 0; 
    this->height = 0; 
    this->data = nullptr; 
} 

처럼 생성자를 다시 작성할 수 있습니다. 이것은 생성자가 종료 될 때 가리키는 메모리가 더 이상 유효한 메모리가 아니기 때문에 중요하지만, 그것이 정크 메모리인지 여부를 확인하기가 어렵 기 때문에 중요합니다. nullptr은 유효한 메모리 위치 (포인터가 아무 것도 가리 키지 않음을 나타 내기 위해 사용됨)를 가리킬 수 없으므로 안전한 값에 대한 포인터를 초기화하는 C++ 11 방식이며 유형 안전입니다.

[C++ (11) 전 C 및 C++ 표준에 우리는 당신이 여기에서 확인 nullptr 사용해야하는 이유에 대한 자세한 내용은, NULL 포인터를 초기화 할에서는 : What are the advantages of using nullptr?]

주목해야 할 또 다른 것은, stargateur 아래 언급 한 바와 같이 , 당신이 C 형 캐스트를 사용했다는 것입니다.이 캐스트는 reinterpret_cast, const_cast 및 static_cast를 결합했기 때문에 강력하지만 매우 똑같은 이유로 안전하지 않습니다. 여기서 당신은 아마도 reiniterpret_cast를 원했을 것입니다.

그러나이 데이터를 초기화하는 또 다른 '더 많은 C++'방법이 있습니다.

당신이//이 스타일을 사용할 수 있습니다 다음을 참조해야하는 이유에 대한 자세한 내용은
ColorBlock::ColorBlock() : //Note the colon here 
    width(0), height(0), data(nullptr) 
{ } 

:
Why should I prefer to use member initialization list?

P.S.을 더 자세하게 설명하기 위해 형식이나 설명을 향상시킬 수 있다면이 사이트를 통해 누군가를 돕는 데있어 첫 번째 시도입니다. 내가 실수를 범하면 그 점도 지적 해주십시오.

수정 : 제안 된대로 변경 사항을 추가하려고 시도했습니다.

+0

이 경우'this-> data = (Color **) temp_data; '를 사용하는 것이 안전하지 않은 이유를 추가하십시오. 하나는 캐스팅이고 다른 하나는 temp_data가 함수의 끝 부분에서 디 트로이가되는 이유입니다. – Stargateur

관련 문제