2014-03-07 3 views
1

다음 코드는 헤더 파일에 있습니다이 간단한 C++ 템플릿 클래스의 문제점은 무엇입니까?

// Represents NxN scalar values (aka square matrix). 
template<std::size_t N> 
class dummy 
{ 
    public: 
    float& operator[](const std::size_t ind) { return scalars[ind]; } 

    private: 
    float scalars[N*N]; 
}; 

using dummy2 = dummy<2>; 

그리고 이것은 내가 그것을 사용하는 것이 방법입니다

// 2x2=4 floats 
dummy2 d; 

std::cout << d[0] << std::endl; // prints 0 
std::cout << d[1] << std::endl; // prints 0 
std::cout << d[2] << std::endl; // prints -1.42253e+19 
std::cout << d[3] << std::endl; // prints 4.59163e-41 

내 질문은 마지막 두 개의 잉크 호출이 0 값에 포함되지 않는 이유 ?

+8

스칼라를 초기화하셨습니까? – billz

답변

4

클래스에 대한 생성자를 제공하지 않았으므로 컴파일러에서 기본값을 생성합니다.이 기본 생성자는 클래스의 모든 멤버를 초기화합니다. 그리고 기본 내장 타입을 초기화하는 것은 그것이 전혀 초기화되지 않았 음을 의미하므로, 값의 사용은 정의되지 않습니다. 즉, scalars은 초기화되지 않았습니다.

이 같은 문제를 해결할 수 있습니다

template<std::size_t N> 
class dummy 
{ 
    public: 
    float& operator[](const std::size_t ind) { return scalars[ind]; } 

    dummy() : scalars() 
    {} 

    private: 
    float scalars[N*N]; 
}; 

using dummy2 = dummy<2>; 

이 대신 기본-초기화의 scalars 초기화 가치와 가치를 초기화하는 float 세트 그것을 0.f에 만드는, 그래서 모든 것이 작동합니다.

Live example

1

scalars은 명시 적으로 초기화되지 않습니다. 처음 두 개의 0은 실제로 정의되지 않은 동작의 결과이므로 생성자에서 배열을 0으로 설정해야합니다.

관련 문제