2011-11-12 5 views

답변

5

아니요, 가능하지 않습니다. size이 동적 변수 인 경우 array[size]은 정적 배열로 구현 될 수 없습니다.

원한다면 다음과 같이 생각하십시오. sizeof(test)은 컴파일시 알려야합니다 (예 : test의 배열을 고려하십시오). 그러나 가상의 예제에서 sizeof(test) == sizeof(int) * (1 + size)은 컴파일 타임의 알려진 값이 아닙니다!

size을 템플릿 매개 변수로 만들 수 있습니다. 그 유일한 해결책에 관하여 :

template <unsigned int N> 
class Test 
{ 
    int array[N]; 
    static const unsigned int size = N; // unnecessary really 
public: 
    // ... 
}; 

사용법 : 지금 우리는 sizeof(Test<N>) == sizeof(int) * (1 + N)Test<50> x;

주, 각 N를 들어, Test<N>는 구별되는 때문에, 컴파일 시간 값을 알려진 사실에입니다 유형.

+0

+1. 지금까지 다른 답변보다 낫습니다! – Nawaz

+0

클래스 전용 정적 정수 상수 접근법의 템플릿 버전이 아닌가? –

+0

@Als : "class-specific static integer"가 이제는 템플릿 매개 변수를 통해 작성자에 의해 지정 될 수 있습니다. –

2

을 제공합니다 당신은 고정 된 크기의 배열을 의미합니까? 이 같은 std::array 사용할 수 있습니다

#include <array> 

class test 
{ 
    static const size_t s_size = 50; 
    std::array<int, s_size> m_array; 
public: 
    test() 
    { 
    } 
}; 

또는 당신은이 같은 클래스 템플릿에 의존 할 필요가 서로 다른 크기의 지원하려는 경우 :

#include <array> 

template <size_t SIZE> 
class test 
{ 
    std::array<int, SIZE> m_array; 
public: 
    test() 
    { 
    } 
}; 

std:array가 크기 정보를 유지의 추가 이점이를 (포인터로 붕괴하는 배열과 달리) 멤버와 함께 사용되며 표준 라이브러리 알고리즘과 호환됩니다.

부스트가 제공하는 버전 (boost::array)도 비슷합니다.

+0

50 대신 상수 클래스 변수를 사용하고 싶습니다.이 방법이 있습니까? –

+0

컴파일 시간 상수 인 경우에만. 답변에 업데이트 된 코드. –

1

컴파일러가 각 멤버의 데이터 형식 크기를 알아야하므로 코드에서 오류가 발생합니다. int arr[N] 타입의 멤버 인 arr을 쓰면 "N 정수의 배열"입니다. N은 컴파일 타임에 알고 있어야합니다.

하나의 해결책은 열거 형을 사용하고 있습니다 :

class test 
{ 
    enum 
    { 
     size = 50 
    }; 

    int arr[size]; 
    public: 
    test() {} 
}; 

또 다른 선언되는 크기 클래스의 같은 const 정적 멤버 : 동급 초기화 정적 클래스의 정수에 대해서만 허용되는

class test 
{ 
    static const int size = 50; 
    int arr[size]; 
    public: 
    test(){} 
}; 

주의! 다른 유형의 경우 코드 파일에서 초기화해야합니다.