2012-07-04 1 views
0

이 클래스의 객체가 생성 될 때마다 UUID를 생성하는이 작은 클래스를 작성했습니다. 어떤 점에서 인수가없는 복사 생성자

#include <boost/uuid/uuid.hpp> 
#include <boost/uuid/uuid_generators.hpp> 
#include <boost/uuid/uuid_io.hpp>  

class myClass { 

public: 

    boost::uuids::uuid GetUUID(); 

    virtual ~myClass(); 

    myClass() { // constructor 
     mId = boost::uuids::random_generator()(); 
     std::cout<< "object created with uuid " << mId <<std::endl; 
    } 

private: 

    boost::uuids::uuid mId; 

} 

, 나는 벡터에 이러한 개체를 밀고 단순 대입 연산자를 사용하여 다른 벡터와 그 벡터를 동일시하고있다. 새 벡터의 객체가 새 UUID를 생성하지 않도록하려면 복사 생성자를 작성하고 싶습니다. 그러나 보시다시피 생성자는 아무런 인수가 필요하지 않습니다. 그래서 복사 생성자를 쓰는 방법을 모르겠습니다. 게다가 하나의 UUID 대신 여러 개의 변수가있는 경우 어떻게 처리해야합니까? 당신은이를 구현하지 않는 경우, 컴파일러가 생성 한 사람이 얕은 사본을 다할 것을

myClass(const myClass& other) 
{ 
    mId = other.mId; 
} 

또한 할당 연산자

myClass& operator=(const myClass& other) 
{ 
    mId = other.mId; 
    return *this; 
} 

참고 :

+0

'mId'는 어떻게 선언됩니까? – sharptooth

+1

할당 연산자를 사용하여 비교하고 있습니까? 또는 '평등'이란 무엇을 의미합니까? 그리고 '생성자는 인수가 필요합니다'라는 말은'two' 인수 또는'no' 인수를 의미합니까? – RedX

+0

실수로 죄송합니다. 나는 그들을 바로 잡았다. –

답변

5

는 다음과 같은 서명을해야합니다 따라서 새로운 UUID는 생성되지 않습니다. 그러나 당신은 그곳에 3 명의 규칙을 따르도록해야합니다 (결국 소멸자가 있습니다).

+0

그의 소멸자는'가상'으로 선언되기 때문에 다른 두 명을 부과하지 않습니다. (반면에'virtual' 소멸자는 클래스가 다형성을 가져야 함을 의미하므로 할당 및 복사가 지원되지 않아야합니다.) –

+0

@JamesKanze 명시 적으로 그것이 그들이 거기에 없다는 것을 감독한다. –

+1

내 자신의 코드에서 클래스에 가상 소멸자가 있으면 기본 클래스로 사용하도록 설계되었으며 일반적으로 복사 및 할당을 지원하지 않습니다. 어느 것이'boost :: noncopyable'을 상속하여 오늘 끝나고, 어떤 경우에는 복사 생성자 나 대입 연산자를 제공하지 않습니다. 그의 경우에는 객체를 컨테이너에 넣는 것에 대해 이야기하고 있기 때문에 가상 소멸자를 삭제해야합니다. 가상 소멸자는 다형성이 될 수 없거나 포인터의 컨테이너를 사용하여 디자인을 다시 생각해야합니다. –

2

컴파일러는 복사 생성자와 할당 연산자를 생성합니다. 이 작업이 수행해야하는 유일한 작업이면 모든 구성원을 복사하는 것입니다. 그러면 컴파일러에서 생성 된 작업이이를 정확히 수행합니다. 그렇지 않은 경우, 복사 생성자의 서명은 다음과 같습니다

myClass(const myClass& other) 

배정의 서명은 다음과 같습니다

myClass& operator=(const myClass& other) 

종류이 경우 기본 복사 생성자에서

스텐

0

에 관하여 컴파일러에서 생성 한 대입 연산자는 예상 한대로 수행해야하므로 명시 적으로 정의 할 필요가 없습니다.