살려주세요!! C++ 클래스가 원하는대로 작동되지 않아요!!
글쓴이: MyAbby / 작성시간: 월, 2013/08/12 - 9:48오후
안녕하세여.
mysql c api를 php의 mysqli 처럼 만들어 서버프로그램에 활용해 보려고 mysqli 짝퉁 클래스를 만들고 있습니다.
근데 뭐... 하루도 안지나서 휴지장이 되었습니다...
생성자 인수는
1. 아무것도 없음: 로컬 서버로 연결
2. 호스트, 유저, 암호, DB이름: 서버 연결 (포트 3306)
3. 호스트, 유저, 암호, DB이름, 포트번호: 서버 연결
DBINFO: 연결 정보를 담아두기 위한 구조체
errstr: 에러 문자열
errnum: 에러 번호
connection_time: 연결 시간제한
session: 개체가 연결한 서버 연결정보
dbcon: mysql api 포인터
real_connect(): 연결 정보를 갖고 실제 서버의 연결 시도
update_errinfo(): 에러 업데이트
생성자의 인수를 제대로 주면 서버 연결은 잘 합니다.
문제는 에러 업데이트에요. 제가 원하는 건 연결 에러가 생기면 errnum에 에러 번호가 들어있어야 합니다.
확실히 생성시 update_errinfo()가 호출이 되는데, 외부에서 참조해 보면 0이 들어가 있습니다!
정적, 동적 두가지 생성 모두 0입니다... 도와주세요... 이거 없으면 이 클래스 더이상 못만듭니다... 쿼리 에러도 저렇게 처리할 건데...
#include <mysql.h> class mysqli { public: struct DBINFO { char addr[40], user[128], pw[128], db[128]; short port; }; char errstr[128]; int errnum; unsigned int connection_time; bool hasConnected; DBINFO session; MYSQL dbcon; void update_errinfo() { errnum = mysql_errno(&dbcon); sprintf(errstr, "MYSQL ERRNO %u: %s", errnum, mysql_error(&dbcon)); } bool real_connect(DBINFO xInfo) { if(mysql_init(&dbcon) == NULL) { return false; } if(!mysql_real_connect(&dbcon, xInfo.addr, xInfo.user, xInfo.pw, xInfo.db, xInfo.port, 0, 0)) { return false; } if(mysql_set_character_set(&dbcon, "utf8")) { return false; } hasConnected = true; return true; } mysqli() { mysqli("", "", "", ""); } mysqli(const char *xAddr, const char *xUser, const char *xPw, const char *xDb) { mysqli(xAddr, xUser, xPw, xDb, 3306); } mysqli(const char *xAddr, const char *xUser, const char *xPw, const char *xDb, const short xPort) { memset(errstr, 0, sizeof(errstr)); errnum = 0; connection_time = 5; hasConnected = false; strcpy(session.addr, xAddr); strcpy(session.user, xUser); strcpy(session.pw, xPw); strcpy(session.db, xDb); session.port = xPort; real_connect(session); update_errinfo(); } };
Forums:
g++ -o main main.cpp
g++ -o main main.cpp $(mysql_config --libs) $(mysql_config --cflags)
이렇게 컴파일 했습니다.
update_errinfo()함수 내에서 errnum을 출력해 보면 에러번호가 제대로 있습니다. 멤버변수가 2개가 만들어 졌나?
생성자 안에서 다른 생성자에 위임하려면 C++11의
생성자 안에서 다른 생성자에 위임하려면 C++11의 위임 생성자를 사용해야합니다.
생성자 안에서 그냥 생성자를 호출하는 건, 그 생성자로 임시 객체를 하나 만드는겁니다.
C++11의 위임생성자를 쓸 수 없다면, 생성자마다 일일이 초기화를 따로 해주거나, 초기화전용 함수를 하나 만들어서 생성자에서 초기화함수를 호출해야합니다.
해결 됫어요!!
mysqli 한개만 남겨두고도 안됬었는데....
update 메서드를 불러주니 제대로 되는군요.
정말 감사해요!1
댓글 달기