[C++] "비정적 멤버 참조는 특정 개체에 상대적이어야 합니다" 오류

jh Seo·2022년 10월 21일
0

C++공부

목록 보기
10/21

개요

백준 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값을 붙여 상수로 만들거나, 동적으로 할당해보라는 글이였다.

이 댓글을 보고 깨달았다.

컴파일 시점에 디폴트 매개변수 값을 변수로 정해버리면 컴파일러 입장에서는
알 수 없는 값이므로 오류가 나는 것이였다.
따라서 컴파일 시점에서 이미 데이터에 올라가있는 값들을 사용해야 한다.

profile
코딩 창고!

0개의 댓글