2013-02-22 1 views
5

이 클래스는 다음 오류를 표시합니다. '정적이 아닌 const 멤버'const int :: membershipNo ', 기본 할당 연산자'를 사용할 수 없습니다. 이상한 점은이 코드가 다른 프로젝트에서 반복되어 완벽하게 작동한다는 것입니다. 내가 그 일을 올바르게하도록 도울 수 있니?'비 정적 정적 멤버 유형은 기본 할당 연산자를 사용할 수 없습니다.'- 이것이 의미하는 바는 무엇입니까?

Member.h

class Member : public Person 
    { 
    public: 
     Member(); 
     Member(int membershipNo); 
     virtual ~Member(); 

     int getMembershipNo() const; 

    private: 
     const int membershipNo; 

     friend class boost::serialization::access; 
     template<class Archive> 
     void serialize(Archive& ar, const unsigned int version) 
     { 
      ar & boost::serialization::base_object<Person>(*this); 
      ar & membershipNo; 
     } 

    }; 

Member.cpp

Member::Member() : membershipNo(0) 
{ 
    Person(); 
} 

Member::Member(int memberNo) : membershipNo(memberNo) 
{ 
    Person(); 
} 

Member::~Member() 
{ 
    // TODO Auto-generated destructor stub 
} 

int Member::getMembershipNo() const 
{ 
    return membershipNo; 
} 

답변

7

아마도 어딘가에 코드에서이 같은 Member, 뭔가에 할당된다.

Member에 할당 연산자 오버로드를 제공하지 않으므로 암시 적으로 정의 된 기본값 할당 연산자가 일반적으로 시작됩니다. 그러나 const 데이터 멤버가 있으므로 컴파일러에서 암시 적으로 정의하지 않습니다. 에 직접 제공하려면이 필요합니다. 난 그냥 준 코드 샘플에서 상상 때문에

이 말이, 컴파일러는 m1membershipNo 회원에게 무엇을해야합니까? 그것에 m2membershipNo을 할당해야합니까? membershipNoconst 인 경우 어떻게 할 수 있습니까? 이 경우 컴파일러는 "아뇨, 할 수 없어요."라고 말합니다. 그러나, 여기 const 회원을 갖는 문제가있다

Member& Member::operator=(const Member& other) 
{ 
    // Copy things from other to this 
} 

:

A defaulted copy/move assignment operator for class X is defined as deleted if X has:

  • a non-static data member of const non-class type (or array thereof)
  • [...]

내가 말했듯이

가하는 Member로 할당을 할 수 있도록, 당신은 당신의 자신의 할당 연산자를 제공해야합니다. 설명한대로 자신의 복사 할당 연산자를 제공하고 membershipNo 이상으로 복사하지 않으면 실제로 다른 객체를 복사 했습니까? 논리적으로는 const 상태 인 을 갖는 객체가에 할당 될 수 없어야합니다.

Member::Member(const Member& other) 
    : membershipNo(other.membershipNo) 
{ 
    // ... 
} 

을 그리고 당신이 할 수 있습니다 :

Member m1; 
Member m2 = m1; 
+0

아, 고마워. 따라서 복사 생성자를 사용하여 const 데이터가있는 객체를 복사하는 방법은 없을까요? – Armada

+0

@Frammo 복사 생성자는 완벽합니다. 자신이 제공하지 않는 한 복사 할당은 없습니다. –

+1

@Frammo가 더 설명했습니다! –

2

어떤 일이 일어나고 것은 일부 클라이언트 코드가 다른 하나 개의 Member 인스턴스를 할당하는 사용하려고한다는 것입니다. 당신은 일정한 데이터 멤버를 가지고 있기 때문에, 이것은 작동하지 않을 수 있습니다. 오류는 일부 코드가 할당을 시도 할 때만 나타나기 때문에 다른 프로젝트에서 같은 클래스가 "작동"하는 것처럼 보일 수 있습니다.

오른쪽에 넣는면에서 옵션은 A) 할당을 수행하지 않거나 B) 데이터 구성원을 const가 아닌 것으로 만듭니다.

Member m1, m2; 
m1 = m2; 

을 또는 당신은 할당 할 유형을 필요로하는 상황에서 사용됩니다

+0

아 당신은 단지 당신이 멤버 초기화 목록에 membershipNo을 초기화 확인해야 -

그러나 복사 생성자를 사용하여 완벽하게 괜찮습니다 그래 네가 맞아. 고맙습니다. 그래서 const 멤버가있는 인스턴스를 복사/할당 할 방법이 없습니까?왜 복사가 const 데이터의 값을 변경하는 규칙을 어기 는가? – Armada

+1

@Frammo 복사가 정상입니다. 할당하지 않습니다. LHS = RHS를 지정하면 LHS가 이미 초기화되었으며 할당은 상태가 변경되었음을 의미합니다. 그리고 국가가 꾸준하다면 ... – juanchopanza

관련 문제