24.12.25 (수)

2024. 12. 25. 11:16·내배캠/TIL

STL에 관한 강의를 듣던 중, sort 의 사용자 정렬 기준을 정하는 함수를 구현하다가 오류가 발생하였다.

Person 클래스의 GetAge와 GetName 함수에서 오류가 발생한 것을 확인했고, 이 포인터가 const Person에서 Person & 타입으로 변환할 수 없다는 것을 확인할 수 있었다.

 

 

이 문제에 대해 조사를 해본 결과

  • C++에서 멤버 함수는 호출된 객체의 주소를 가리키는 'this' 포인터를 암묵적으로 사용한다.
  • const 객체에서 멤버 함수를 호출하면, 'this' 포인터는 const 포인터 타입으로 전달된다.
  • 그러나 const가 아닌 멤버 함수를 호출하면,  일반 포인터 타입의 'this' 포인터를 필요로 한다.
  • 이 차이로 인해 const 포인터를 일반 포인터로 변환하려고 시도하지만, 이는 안전하지 않기 때문에 컴파일러가 오류를 발생시킨 것이다.

 

아래 코드를 보면

class Person
{
private:
    int age;
    string name;

public:
    Person(int age, string name) : age(age), name(name) {}

    int GetAge() { return age; }
    string GetName() { return name; }
};
bool compare(const Person& a, const Person& b)
{
    if (a.GetAge() == b.GetAge())
    {
        return a.GetName() < b.GetName();
    }
    return a.GetAge() < b.GetAge();
}

int main() 
{
    vector<Person> people =
    {
        Person(39,"Bob"),
        Person(21,"Alise"),
        Person(29,"Dong"),
        Person(29,"Hyeon"),
        Person(5,"Chase")
    };

    sort(people.begin(), people.end(), compare);

    return 0;
}

 

Compare 함수에서 멤버 함수를 호출하는 객체는 const Person 클래스 포인터이기 때문에 이 포인터가 호출하려는 멤버 함수 역시 const로 선언되어야 호출될 수 있지만, 멤버 함수 GetAge와 GetName 함수가 const로 선언되어있지 않았다는 것을 확인했다.

 

 

*수정된 코드

더보기

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class Person
{
private:
    int age;
    string name;

public:
    Person(int age, string name) : age(age), name(name) {}
	
    //멤버 함수 const 선언
    int GetAge()  const { return age; }
    string GetName()  const { return name; }
};

bool compare(const Person& a, const Person& b)
{
    if (a.GetAge() == b.GetAge())
    {
        return a.GetName() < b.GetName();
    }
    return a.GetAge() < b.GetAge();
}

int main() 
{
    vector<Person> people =
    {
        Person(39,"Bob"),
        Person(21,"Alise"),
        Person(29,"Dong"),
        Person(29,"Hyeon"),
        Person(5,"Chase")
    };

    sort(people.begin(), people.end(), compare);

    return 0;
}

People 클래스의 멤버 함수를 const로 선언하였고 정상적으로 정렬할 수 있게 되었다.

 

'내배캠 > TIL' 카테고리의 다른 글

24.12.27 (금)  (0) 2024.12.27
24.12.26 (목)  (0) 2024.12.26
24.12.24 (화)  (0) 2024.12.24
24.12.23 (월)  (2) 2024.12.23
24.12.21 (토)  (2) 2024.12.21
'내배캠/TIL' 카테고리의 다른 글
  • 24.12.27 (금)
  • 24.12.26 (목)
  • 24.12.24 (화)
  • 24.12.23 (월)
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    24.12.25 (수)
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.