2013-03-07 4 views
-2

이전에 비슷한 질문을했지만 더 자세히 설명하고 싶습니다. 내가 직면 한 문제는 복사 할 수없는 개체가 포함 된 개체가 있고 누군가 내 인터페이스를 사용하려고 할 때 잘 사용하지 않으면 (개체의 복사 생성자를 사용하려고 시도 할 때) 컴파일 오류가 발생합니다. 그의 실제 코드가 아니라 객체를 가리 킵니다. 두 가지 질문은 다음과 같습니다. 1. 원래 코드 줄로 가리킬 수 있습니까? 2. 내가 할 수 없다면 누군가가 실제로 복사를 사용하려고 시도 할 때만 발생하는 static_assert를 넣을 수 있습니다 (몇 가지 시도해 봤지만 누군가 사용하지 않아도 얻을 수 있습니다 ..). .복사 할 수없는 개체가 포함 된 개체에 대한 컴파일 경고를 읽을 수 없습니다.

내가 이해할 수 없을 경우에 대비해 샘플 코드와 컴파일 오류를 추가하고 있습니다 ... 마지막 컴파일 오류가 ObjectHolder를 가리키고 있습니다. h. 파일 .. 메인을 가리키고 싶을 때 고마워요!

*은 이름을 바꿀 때 실수였습니다. 실제로 컴파일 오류를 생성 한 코드입니다. 와의 난 그냥 제공되는 코드를 반영하지 않습니다 공급

class NonCopyableObject 
{ 
    public: 
     virtual ~NonCopyableObject() {} 

     NonCopyableObject(int i) { m_index = i;} 
     int m_index; 
    private: 
     NonCopyableObject(const NonCopyableObject& other) {} 
}; 

class ObjectHolder 
{ 
    public: 
     virtual ~ObjectHolder(); 
     ObjectHolder(int i) : obj(i) {} 

     NonCopyableObject obj; 
}; 

void main() 
{ 
    ObjectHolder first(1); 
    ObjectHolder second(first); 
} 

1>------ Build started: Project: tester, Configuration: Debug Win32 ------ 
1> main.cpp 
1>d:\users\someone\documents\visual studio 2012\projects\tester\tester\objectholder.h(13): error C2248: 'NonCopyableObject::NonCopyableObject' : cannot access private member declared in class 'NonCopyableObject' 
1>   d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(15) : see declaration of 'NonCopyableObject::NonCopyableObject' 
1>   d:\users\someone\documents\visual studio 2012\projects\tester\tester\noncopyableobject.h(8) : see declaration of 'NonCopyableObject' 
1>   This diagnostic occurred in the compiler generated function 'ObjectHolder::ObjectHolder(const ObjectHolder &)' 
+1

ObjectHolder에서도 복사 생성자를 숨기려고합니다. –

+4

여기는 컴파일 오류가 발생한 실제 코드가 아닌 것이 확실합니다. – Nawaz

+0

개체에 액세스 가능한 복사본 생성자가 없도록하려면 'private'(또는 C++ 11에서는'delete')로 만듭니다. –

답변

1

오류 메시지를 복사 할 장애를 전달하는 개인 복사 c'tor을 구현하고 싶지 않은 가정하자.

그건 그렇고 오류가 있습니다. 컴파일러는 가정되는 방법

class ObjectHolder 
{ 
    public: 
     virtual ~ObjectHolder(); 
     ObjectHolder(int i) : obj(i) {} 

     ObjectHolder obj; 
}; 

이는 재귀 때 ObjectHolder에 필요한 메모리의 양을 확인하기 : 코드를 고려?

+0

복사했을 때 실수였습니다 !! 실제로는 클래스입니다. ObjectHolder { public : virtual ~ ObjectHolder(); ObjectHolder (int i) : obj (i) {} NonCopyableObject obj; }; – Alon