인프런 커뮤니티 질문&답변

오그리바그리님의 프로필 이미지
오그리바그리

작성한 질문수

C++ 멤버함수의 class가 논리적으로 적합하지 않다고 오류가 날 수 있나요

작성

·

525

0

C++ 멤버함수의 class가 논리적으로 적합하지 않다고 오류가 날 수 있나요?

 

C++로 이진트리 자료구조를 공부하는데

class의 멤버함수를 딱히 상관하지 않고 c스타일로 매개변수로 주소를 주다보니까

class별 멤버함수들이 약간 꼬였는데

주소를 매개변수로 줘서 작동에는 상관이 없을 줄 알았는데 실행이 안됩니다.

그래서 해당 함수를 queuetype 넣고 접근제어지시자들만 수정하니까 정상적으로 됩니다

컴파일러가 논리적으로 적합한 class를 구분하는 일도 하나요?

 


혹시 몰라 코드도 올립니다. C스타일을 C++로 고치면서해서 좀 엉성해서 죄송합니다.

class treenode {

	int data;
	treenode* llink, * rlink;
public:
	treenode() :data{}, llink{ NULL }, rlink{ NULL } {
	}

	treenode(int a, treenode* n1, treenode* n2) :data{ a }, llink{ n1 }, rlink{ n2 } {
	}

	void level_order(treenode* root);

        //-------문제 함수-----------------------
	void enque(queuetype* que, treenode* item);
	treenode* deque(queuetype* que);
	 //-------문제 함수-----------------------

};

#define size 100
class queuetype {
public:
	int front, rear;
	treenode* stack[size];

	void init_queue();
	int is_empty();
	int is_full();
};

void error(const char* mss) {
	cout << mss << endl;
	exit(1);
}

void queuetype::init_queue() {
	this->front = this->rear = 0;
}

int queuetype::is_empty() {
	return this->front == this->rear;
}
int queuetype::is_full() {
	return ((this->rear + 1) % size == this->front);
}

 //-------문제 함수-----------------------
void treenode::enque(queuetype* que,treenode* item){
	if (que->is_full())
		error("error");
	que->rear = (que->rear + 1) % size;
	que->stack[que->rear]=item;
}
treenode* treenode::deque(queuetype* que) {
	if(que->is_empty())
		error("error");
	que->front = (que->front + 1) % size;
	
	return que->stack[que->front];
}
 //-------문제 함수-----------------------

void treenode::level_order(treenode* root){
	queuetype q;
	q.init_queue();

	if (root == NULL)return;
	root->enque(&q,root);

	while (!q.is_empty()) {
		root = deque(&q);
		cout << root->data << endl;
		if (root->llink)
			enque(&q, root->llink);
		if(root->rlink)
			enque(&q, root->rlink);
	}
	

}


treenode n1 = { 1,NULL,NULL };
treenode n2 = { 3,&n1,NULL };
treenode n3 = { 12,NULL,NULL };
treenode n4 = { 25,NULL,NULL };
treenode n5 = { 18,&n3,&n4 };
treenode n6 = { 14,&n2,&n5 };
treenode* root = &n6;

int main() {
	
	cout << "중위 순회=";
	root->level_order(root);
	cout << endl;

	return 0;
}

 

답변 2

0

자바스크립트나 자바, C# 등등 많은 언어가 타입 선언이 먼저 안되어도 정상 컴파일, 구동 되지만 C는 타입이 선언되기 전에 타입을 적으면 해당 라인 앞에 정의된 형식이 아니므로 컴파일 안됩니다. (클래스 내에서 동일 클래스의 멤버변수나 함수는 선언이 먼저 안되어있어도 예외적으로 호출 되지만요.)

 

PINT intptr;

typedef int* PINT;

이게 컴파일 안되고

 

void main() { printf(“message\n”); }

#include <stdio.h>

이것도 컴파일 안되는건 마찬가지 이유입니다.

 

위에분 답글처럼 class queuetype;를 treenode 앞에 먼저 타입을 선언해주시면 되겠습니디.

답변감사합니다.

C++도 C처럼 앞에 타입 선언을 미리 알려줘야지 문제없이 정상작동이 되는군요..감사합니다.

제가 다른 언어는 잘 몰라서 그런데 다른 언어는 미리 타입선언을 안해도 알아서 구동이되나요?

0

treenode 클래스 선언문쪽에서는 아직 queuetype 클래스가 존재하는지 알지 못합니다.

treenode 클래스 앞에

class queuetype;

혹은

함수선언쪽을

void enque(class queuetype* que, treenode * item)

으로 변경 해주시면 될 것 같습니다

와, 설마 했는데 이거였군요..
감사합니다,

오그리바그리님의 프로필 이미지
오그리바그리

작성한 질문수

질문하기