구문 오류에 대해서 질문입니다.

balgarac1의 이미지

user 구조체를 정의했습니다.
 
#ifndef __USER_H__
#define __USER_H__
 
#include "ThreadClient.h"
#include "commandHandler.h"
 
typedef struct _user
{
 
	commandHandler *cmdHand;
	SOCKET sock;
	char ID[25];
 
} User;
 
#endif
 
commandHandler 클래스에서 User 구조체를 사용하기 위해 헤더 파일을 포함했는데 User가 선언된 부분에서는 전부다 구문 오류가 납니다.
세미 콜론을 빼먹은 것도 아닌데 왜 뜬금없이 구문오류가 나는지 잘 모르겠습니다. 
 
#ifndef _COMMNAD_HANDLER_H_
#define _COMMAND_HANDLER_H_
 
#include <map>
#include <iostream>
#include "ThreadClient.h"
#include "user.h"
 
using namespace std;
 
class commandHandler
{
 
	private:
 
 
		 char cmd[20];
		 char sendBuff[BUFSIZ];
		 typedef void (*cmdHandler)(User&);
 
 
	public:
 
		 commandHandler();
		 ~commandHandler();
 
 
		 void who(User&);
		 void quit(User&);
		 void user(User&);
		 void talk(User&);
		 void help(User&);
		 void debug(User&);
 
		 map<char *, cmdHandler> cmdHandlerMap;
		 pair<map<char *, cmdHandler>::iterator, bool> mpair;
 
 
};
 
#endif

kukyakya의 이미지

User는 commandHandler를 필요로 하고, commandHandler는 다시 User를 필요로 해서 생기는 순환 오류입니다.

어차피 User에는 commandHandler의 포인터만 필요하니 commandHandler.h를 include하지 마시고 forward declaration만 해주시면 될 것 같습니다.

또한 c binding을 별도로 제공하실 계획이 아니시라면 struct는 따로 typedef하지 않으셔도 됩니다.

#ifndef __USER_H__
#define __USER_H__
 
#include "ThreadClient.h"
//#include "commandHandler.h"
 
class commandHandler;
 
struct User
{
	commandHandler *cmdHand;
	SOCKET sock;
	char ID[25]; // std::string을 사용하는 것이 더 나음
};
 
#endif
balgarac1의 이미지

조언 덕분에 잘 해결하고 좋은 지식 잘 얻어 갑니다. 감사합니다 ^^ !!!