2013-03-19 2 views
0

배열이 있으므로이 변수를 private 멤버 변수로 사용하고 싶습니다. 내 프로그램이 선택 정렬을 구현하는 방식은 배열의 크기에 따라 달라지는 기본 메소드이며, 생성자는 전달되어 지정된 크기로 새 배열을 만듭니다.C++ 멤버 전용 배열 변수 - 컴파일시에 정의되지 않음

저는 Java로 해왔지만 C++로는 알 수 없습니다. (이 웹에서 다른 사람들의 게시물을 살펴본 후 내 변수를 정적으로 만들어야한다는 것을 알았습니다)

감사합니다.

[ArrayS.h]

public: 
    ArrayS(void); 
    ArrayS(int max); 
    ~ArrayS(void); 

private: 
     static long a [0]; 

[ArrayS.cpp]

ArrayS::ArrayS(void) 
{ 

} 

ArrayS::ArrayS(int max) 
{ 
    long ArrayS::a [max];     
    nElems = 0; 
} 

감사합니다.

+0

배열의 크기가 다를 수있는 경우'long a [0]; '을 사용하지 마십시오. '0'은 정확한 크기가 아닙니다. 'std :: vector a; ' –

+0

을 사용하십시오. 런타임에 정의 된 크기의 배열을 생성하려면'std :: vector' 또는 유사한 것을 사용하십시오. '정적'은 당신을 아무 곳에도 데려 갈 수 없습니다. – chris

+0

'정적'데이터 멤버가 필요하지는 않습니다. – juanchopanza

답변

1

위의 코드에는 두 가지 문제가 있습니다. 첫 번째는 C++에서이 두 번째 클래스의 정적 멤버를 들어, 정확히 하나의 번역 단위에서 정의를 제공 할 필요가있다 크기 0의 배열을 가질 수 있다는 것입니다 : 그 외

struct test { 
    static long a[10]; 
}; 
// in a single .cpp 
long test::a[10] = {}; 

을, 런타임에만 알 수있는 크기의 배열이 필요한 경우 원시 배열을 사용할 수 없습니다. 동적으로 할당 된 메모리 (new[] 통해)를 사용할 수 있지만 std::vector<long>을 사용하는 것이 더 낫습니다. 또한 회원이 실제로 static이 될 필요가 있는지 여부는 불분명합니다. 그 문맥에있는 static 키워드는 클래스 구성원을 의미합니다 (즉, 인스턴스 코드가 아닌 프로그램의 모든 코드에서 공유합니다).

+0

std :: vector를 사용하겠습니다. 감사 – SndLt

0

변수를 클래스 외부에서 다시 정의해야합니다. 정적 멤버가있을 때마다. g ++은 크기가 0 인 배열을 가진 C++ 코드를 컴파일하지만 실제로 원하는 경우 다시 고려합니다.