2009-10-28 5 views
9

이 합법적 인 C++ (예, 나는 그것이 합법적 인 것을 알고 있습니다.) 그렇다면, 어떻게/왜 사용됩니까?클래스를 C++에서 정적으로 선언 할 수 있습니까?

static class foo{ 
    public: 
     foo(); 
     int doIt(int a); 
}; 
+4

"그렇습니다 .net에서 합법적 인 것입니다."사실이 아닙니다. C++/CLI에서 정적 클래스는 '정적 클래스 MyClass'가 아니라'ref class MyClass abstract sealed'로 선언되었습니다 (C# 구문). –

답변

22

아니요, 이것은 C++에서 지원되지 않습니다. .NET에서 static 지정자가 수행하는 유일한 작업은 모든 클래스 멤버를 정적으로 만드는 것입니다. 그것은 단지 도우미 키워드 일뿐입니다. C++에서 정적 클래스를 작성하려면 클래스의 각 멤버가 static으로 표시되어 있는지 확인해야합니다. (편집 : 비공개 생성자이므로 "정적"클래스를 인스턴스화 할 수 없습니다.)

+2

또한 비공개 (이상적으로는 개인) 생성자가 필요합니다. –

+0

아, 네. 내가 뭔가 잊고 있다는 걸 알았어! –

+4

일반적으로 이것은 네임 스페이스에 있습니다. – GManNickG

0

아니, static 개체 및 기능입니다.

8

C++에서 정적 클래스와 가장 유사한 것은 정적 멤버 변수 만 가진 클래스입니다. 이를 monostate 패턴이라고합니다. 이러한 클래스는이 클래스의 모든 인스턴스가 동일한 상태를 갖게됨을 의미합니다. 모노 스테이트 인스턴스의 사용법 구문은 싱글 톤 클래스와 달리 일반 클래스와 유사하며 실제로 모노 스테이트 클래스는 사용법을 변경하지 않고 일반 클래스로 변환 될 수 있습니다. 예 :

// Monostate class 
public class Administrator 
{ 
    private: 
    static int _userId; 
    public 
    int UserId() { return _userId; } 
} 

// Initializing the monostate value 
int Administrator::_userId = 42; 

// Using an instance of a monostate class 
void Foo() 
{ 
    Administrator admin = new Administrator(); 
    Assert.Equals(42, admin.UserId()); // will always be 42 
} 
25

는 C++/CLI를 사용하는 경우, static 실제 구문 ++ C의 파일 레벨 범위에서

ref class Foo abstract sealed /* abstract sealed = C# static */ 
{ 
}; 
+0

+1 ** 정답 **입니다. 클래스를 이와 같이 표시하면 C#에서 클래스를 'var f = Foo();'로 인스턴스화하면 예상되는 오류가 발생합니다 * "정적 유형 Foo의 변수를 선언 할 수 없습니다"* 및 * " 정적 클래스 Foo "*, C#은 (C#)"정적 "클래스라고 간주 함을 나타냅니다. –

6

static 개질제 static 표시된 식별자가에서만 표시 한 것을 나타낸다 정의 된 파일. 이 구문은 클래스 (오직 방법 및 변수)에 사용할 수 없지만 동일한 효과 익명 네임 스페이스를 사용하여 클래스를 얻을 수있다 :

namespace{ 
    class Foo{}; 
}; 
-1

클래스는 정적 일 수 없다. 다른 언어의 정적 클래스의 경우 정적 멤버 만 사용하는 클래스를 선언합니다.

클래스 선언 전의 static은 즉시 생성 된 개체를 의미하며 대부분 익명 클래스와 함께 유용합니다.

static class Foo {} foo; 

Foo

, 여기에 클래스의 이름은 선택 사항입니다.

관련 문제