백준 3190번 : 뱀
문제를 풀기 위해 클래스 구현 중에 프로퍼티 함수를 구현해 보려고 하는 도중에 오류가 떴다.
밑에 대충 구조만 적었는데
class Snake{
private:
char dir;
int size;
Node* head;
Node* tail;
public:
char Dir(char input = dir) {
dir = input;
return dir;
}
}
Set(), Get()을 합칠 수 없을까 하고 Dir 함수를 구현해봤다.
저렇게 input매개변수의 디폴트값으로 멤버변수인 dir값을 그대로 주었다.
그러자 "비정적 멤버 참조는 특정 개체에 상대적이어야 합니다" 오류가 떴고,
이게 무슨 소린지 잘 몰라서 검색을 하였다.
대부분 이 오류는
[C/C++] error: 비정적 멤버 참조는 특정 개체에 상대적이어야 합니다
이 분의 블로그 처럼 다른 소스파일의 클래스를 호출할 때 인스턴스 생성 없이 호출할때
나는 오류라고 한다.
하지만 나 같은 경우는 매개변수의 디폴트값으로 멤버 변수를 불러와 생긴 것이므로
여기저기 찾아보니 이런 글이 있었다.
https://stackoverflow.com/questions/40837314/cant-figure-out-this-non-static-member-reference-error
늘 스승이 되어주는 스택오버플로의 질문글인데 이 사람은
class Application
private:
int numShapes;
public:
Shapes * shapes[numShapes];
이런식으로 shpaes배열의 값을 멤버변수로 초기화를 한 상황이고, 나와 같은 오류가 떴다.
밑의 댓글을 보니, 컴파일 시점에서 numShapes가 정해지지 않았기 때문에
numShapes변수를 const값을 붙여 상수로 만들거나, 동적으로 할당해보라는 글이였다.
이 댓글을 보고 깨달았다.
컴파일 시점에 디폴트 매개변수 값을 변수로 정해버리면 컴파일러 입장에서는
알 수 없는 값이므로 오류가 나는 것이였다.
따라서 컴파일 시점에서 이미 데이터에 올라가있는 값들을 사용해야 한다.