2014-01-05 2 views
4

2 개가 아닌 하나의 생성자를 작성하고 일반 오브젝트와 변경 불가능한 오브젝트를 모두 작성할 수 있습니까? 정상 생성자와 불변 생성자를 모두 작성하는 것은 반복적 인 작업입니다.D에서 불변 및 일반 생성자를 결합 하시겠습니까?

class ExampleClass 
{ 
    void print() const 
    { 
     writeln(i); 
    } 

    this(int n) 
    { 
     i = n * 5; 
    } 

    this(int n) immutable 
    { 
     i = n * 5; 
    } 

private: 
    int i; 
} 

답변

7

생성자를 pure으로 만들고 암시 적으로 모든 한정자로 변환 할 수 있습니다.

this(int n) pure 
{ 
    i = n * 5; 
} 

auto i = new immutable ExampleClass(2); 
auto m = new ExampleClass(3); 

여기 문서화 : 이 http://dlang.org/class.html "(순수한 경우 예) 생성자의 객체를 생성 할 경우, 객체가 어떤 규정에 암시 적으로 변환 할 수 있습니다."BTW

: 기타의 반환 값 순수한 함수도 암시 적으로 변환합니다.

// returns mutable... 
char[] cool() pure { 
    return ['c', 'o', 'o', 'l']; 
} 

void main() { 
    char[] c = cool(); // so this obviously works 
    string i = cool(); // but since it is pure, this works too 
} 

직장에서와 같은 원리입니다. 고유하기 때문에 공유되거나 변경되지 않을 수도 있습니다.

+0

당신이 맞아요,이 예제의 경우 작동합니다. 그러나 내 실제 사용 예에서 glCreateShader와 같은 불순한 함수를 호출해야 솔루션이 작동하지 않습니다. :/ – Scintillo

+1

@Scintillo이 경우, 당신은 실제로 불변의 객체를 생성하고 있습니까? 그것은 돌연변이를 허용 할 것 같은데,이 경우 당신은 불변의 인스턴스를 만드는 것을 금지 할 수 있습니다. – Cubic

+0

@Cubic OpenGL은 리소스를 변경할 수 없기 때문에 객체를 변형 할 수 있습니다. Immutable은 리소스 ID 래퍼 포인트를 변경하지 못하도록하고 "이 객체를 수정하지 마십시오."라는 지침이됩니다. – Scintillo

관련 문제