2014-11-12 6 views
3

.NET Framework에서 Visual C++을 사용하는 간단한 GUI를 작성하고 있으며 참조 클래스에 대해 합성 복사 생성자 또는 할당 연산자가없는 이유가 궁금합니다..NET CLI가 합성 클래스 생성자와 참조 클래스에 대한 할당 연산자를 제공하지 않는 이유는 무엇입니까?

기본적으로 Visual Studio에서 Windows Form 응용 프로그램을 시작하고 매개 변수의 자체 데이터 구조를 가지고 있습니다. 그러나, 나는 그것의 인스턴스 (그리고 그것의 인스턴스에 대한 포인터) 내 MainForm 클래스에서 필요하고 후자는 참조 클래스이기 때문에 너무 내 구조 참조를 만들어야했다.

+2

C++ cli는 C++과 완전히 다른 언어이므로 객체 sematics가 C++보다 C#에 더 가깝습니다. 참조 : http://msdn.microsoft.com/en-us/library/ms173116.aspx – IdeaHat

+0

더 많은 "할당 연산자"는 참조 클래스와 관련이 없습니다. 참조 클래스의 모든 스태 이스 (예 : Foo ^)는 실제로 핸들입니다. 'Foo^a = gcnew Foo(); Foo^b = a; '는 b와 a가 같은 핸들임을 의미합니다. – IdeaHat

+0

@IdeaHat, 응답을 고맙게 여긴다 그러나 나는 그들이 다른 언어다는 것을 깨닫는다. 누군가가 근본적인 동기 부여에 대한 간단한 설명을 줄 수 있기를 바랬습니다. – ministry

답변

1

C++ CLI가 참조 기반 언어 (가비지 수집되었지만 두 경우이 경우 구별 할 수 없음) 인 .NET 언어이기 때문에 길고 짧습니다. 거의 모든 모든 인스턴스가, 핸들을 통해 액세스

Foo^ a = gcnew Foo(); Foo^ b = a; 

a와 같은 객체에 b 포인트 있도록하는 것을 의미 참고로 기본. 이는 Java와 같은 다른 참조 용 언어에서도 마찬가지입니다.

이 부작용은 C++과 달리 a이 가리키는 인스턴스를 "소유"하지 않습니다. a의 실제 수명은 모든 핸들보다 간단합니다. 이렇게하면 기본 복사 구성자가 불가능하게됩니다. 우리는 푸의 복사, 컴파일러는 푸 막대를 소유 아닌지 알 수있는 방법이 없는지 확인하면

ref class Foo 
{ 
    Bar^ bar; 
}; 

: 간단한 참조 클래스를 가져 가라. 따라서 핸들 (얕은 복사본)을 복사할지 또는 새 Bar (원본 복사본)을 인스턴스화할지 여부를 결정할 수 없습니다. 따라서, 이러한 언어의 설계자는 일반적으로 기본 복사 생성자를 제공하지 않습니다.

+0

흠, C++에서는 그다지 다르지 않습니다. 기본 복사 도구는 맹목적으로 포인터를 복사합니다. –

+1

@HansPassant 나는 당신이 말하고자하는 것을 얻는다. 그러나 C++의 가치 의미는 포인터의 복사 생성자가 포인터의 값을 복사한다는 것을 의미한다. 이것은 C++에서 알려진 문제입니다 (raw 포인터로 가리키는 값의 소유권은 항상 이상합니다). 그래서 우리는 3의 규칙을 갖지만, 주제에 대한 현대적인 생각은 "0의 규칙"을 시도하고 따르는 것입니다. : 스마트 포인터를 사용하여 소유권이 항상 명시 적이며 기본 복사 생성자가 항상 의미가 있습니다. 그러나 가비지 수집 언어에서는 소유권이 매우 불투명하기 때문에 어떤 방식 으로든 소유권을 주장 할 수 없습니다. – IdeaHat