2014-10-05 2 views
-1

Foo 클래스에서 멤버 변수 bar가 있습니다. 바는 다음과 같이 배열에 대한 포인터를 전달하여 내 푸 생성자으로 구성되어있다 : T는 기본 생성자가있는 경우배열을 기본값으로 초기화하지 않습니다.

내 지식 이제
template<typename> T 
class Foo{ 
Bar myBar; 
size_t mySize; 
size_t top; 
Foo(size):myBar(new T[size]),mySize(size),top(0){}; //creates a Bar element of certain size 
} 

template<typename> T 
class Bar{ 
T* myListPtr; 
Bar::Bar(T* tPtr):myListPtr(tPtr){} //stores a pointer to a T array 
} 

, C++ 배열의 모든 요소에서이 작업을 호출해야합니다. 그러나 지적되고있는 I 출력 값, 나는 ('두 배'크기 = 8, T 타입)이 같은 배열을 받았을 때

9.3218e-306 
0 
0 
0 
0 
3.81522e-270 
nan 
nan 

나는 모든 값이 초기화 기본 있는지 확인 할 방법 및 뿐만 아니라 일부. 이 배열은 char, double, 모든 유형을 보유 할 수 있지만 유형에는 항상 기본 생성자가 있습니다. 이 문제의 원인은 무엇입니까? 내 지식 이제

+1

[MCVE] (http://stackoverflow.com/help/mcve)를 게시하십시오. – juanchopanza

+0

포인터를 요소 배열에 복사 할 때 요소가 복사 된 이유는 무엇입니까? – Deduplicator

+3

@Chris 음, 아니, 항상 그런 것은 아닙니다. 그리고 "C/C++"같은 것이 없으므로 그 신화가 퍼지기를 바랍니다. 건배. –

답변

1

, T는 기본 생성자이있는 경우, C++ 배열의 모든 요소에서이 작업을 호출해야합니다. 로 지적되고있는 I 출력 값, 나는 (크기 = 8, T 형 '더블'와) 같은 배열을 가지고 그러나 때

당신은 경우에 사용됩니다 기본 생성자에서 정확 하나 존재합니다. 그러나 double (및 int, float, char 등)과 같은 기본 유형은 이 아니며에는 생성자 또는 기본값이 있습니다. 이 언어를 사용하면 대부분의 경우 동일한 구문으로 기본 유형 및 클래스 유형을 사용할 수 있지만 이는 근본적인 차이입니다.

그래서 다음

MyClass myInstance; 

는 기본 생성자를 호출하는 클래스를 MyClass을 부여.

그러나 주어진 두 번 다음

double myDouble; 

어떤 방법으로 초기화되지 않습니다.

결과적으로 예제에서와 같이 두 배의 배열을 만들면 초기화되지 않습니다.

이제 논리적 질문은 초기화하는 방법입니다. This stackoverflow question은 답변을 제공하며 std::vector을 사용하면 원시 배열에 자주 발생하는 문제를 피할 수 있다는 보람있는 조언을 제공합니다.

관련 문제