클래스 내 함수를 막기 위해서는
아래와 같이 private으로 막아주면 된다
class Knight
{
public:
private:
void operator=(const Knight& k)
{
}
private:
int mhp = 100;
}
int main()
{
Knight k1;
Knight k2;
//k1 = k2;// 복사 연산자 작동 불가
}
하지만 friend를 이용하면 이를 간접적으로 뚫을 수 있다
class Knight
{
public:
private:
void operator=(const Knight& k)
{
}
friend class Admin;
private:
int mhp = 100;
};
class Admin
{
public:
void CopyKnight(const Knight& k)
{
Knight k1;
k1 = k;// 작동 가능
}
};
위처럼 friend로 뚫리는 것을 막으려면
아래와 같이 구현부를 만들지 않으면 되지만
Admin 클래스 함수 내에서는 에러가 감지되지 않는다
class Knight
{
public:
private:
void operator=(const Knight& k);// 구현부를 만들지 않아주면 이를 막을 수 있다
friend class Admin;
private:
int mhp = 100;
};
class Admin
{
public:
void CopyKnight(const Knight& k)
{
Knight k1;
k1 = k;// 이 부분의 에러 메시지는 보내주지 않음
}
};
int main()
{
Knight k1;
Admin admin;
//admin.CopyKnight(k1);// 빌드 에러 발생
}
결국 위와 같은 방식과 문제를 해결하기 위해 등장한 delete
class Knight
{
public:// delete 함수는 public으로 하는 것이 일반적이다
void operator=(const Knight& k) = delete;// 사용하지 않을 함수에 delete를 적어주면 된다
friend class Admin;
private:
int mhp = 100;
};
class Admin
{
public:
void CopyKnight(const Knight& k)
{
Knight k1;
//k1 = k;// 에러메시지(삭제된 함수) 발생 및 빌드 에러 발생
}
};
int main()
{
Knight k1;
Admin admin;
//admin.CopyKnight(k1);// 에러메시지(삭제된 함수) 발생 및 빌드 에러 발생
}
'C++ > [루키스] Modern C++' 카테고리의 다른 글
[MC++] 오른 값 참조 (Rvalue reference)와 std::move (0) | 2023.07.02 |
---|---|
[MC++] override, final (0) | 2023.07.01 |
[MC++] enum class (0) | 2023.06.30 |
[MC++] using (0) | 2023.06.29 |
[MC++] nullptr (0) | 2023.06.29 |