2010-07-14 6 views
0

이 문제와 관련된 파일이 3 개 있습니다. file.h, file.C 및 user.C.C++ 헤더 파일의 가변 범위 문제

file.h에는 private 멤버 인 fstream 로그가 있습니다.

file.C의 생성자에서 로그를 엽니 다. 생성자에서는이 작업을 수행하지 않지만 생성자는 OpenLog() 함수를 호출합니다.

file.h 또한 인라인 가까운 기능을 가지고 :

CloseLog() {if (logs) logs.close();}

파일 user.C 파일의 인스턴스를 생성 종료 기능을 가지고, 다음 CloseLog 호출합니다. 이 시점에서 오류가 발생합니다. 다른 더미 테스트를 만들었고 로그가 믹스 어딘가에서 사라지는 것처럼 보입니다 ...

file.C에서 user.C로 이동 한 다음 file.C로 돌아갑니다. fstream 로그를 file.C에서 전역으로 사용하는 경우 작동하지만 - 전역으로 피하는 것이 좋습니다.

내가 여기에서해야 할 것에 대한 의견이 있으십니까? 이것에 대해 더 많은 코드를 게시해야한다면 알려 주시기 바랍니다. 더 나은 데모를 위해 약간의 더미 물건을 설정할 수 있습니다.

** 여기에 더 코드는, 요청에 따라 - 내가

내가 클래스 helpME.h, helpME.C 및 user.C를 호출 복사 및 붙여 넣기, 그래서 ** 그것의 부족 제발 용서 할 수없는

//helpME.h
#ifndef _helpME_H
#define _helpME_H

#include < iostream>
#include < fstream>
//various includes

class helpME {
private:
fstream logs;

public:
void CloseLog() {if (logs) logs.close();}
};
#endif

//end helpME.h

//helpME.C
void helpME::helpME(int argc, char** argv)
{
//various code
OpenLog();
}

void helpME::OpenLog()
{
//logname is set above, i had a print statement before that showed this is correct
logs.open(logname, ios::in | ios::out | ios::trunc);
}

//end helpME.C

//user.C
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;
hME->CloseLog();
}

//end user.C

다시 - 명확성의 부족을 용서하십시오, 나는 ...이 코드가 다른 상자에 이상 복사 할 수 없습니다이를 추가하여 단지 혼란 가지 더있을 수 있습니다 생각하고 있어요.

+3

예, 코드의 관련 부분을 게시해야합니다. 너의 설명이 나에게 분명하지 않다. –

+2

하나의 참고 사항 : 파일에는 생성자/소멸자/멤버가 없으며 클래스가 수행합니다. –

+0

베드로가 한 말을 강조하기 위해, 이것은 당신의 묘사가 불완전하지만 긍정적 인 잘못이 아니라는 점에서 형편없는 형식의 질문입니다. 또한 "파일에서 C로 이동"이라는 의미를 분명히 알지 못합니다. 몇 가지 코드, 가능한 한 완전한 최소 예를 게시하십시오. –

답변

0
void user::quitHelpME(item) 
{ 
helpME* hME = (helpME*) item; 

helpME에 대한 포인터에 무엇이든 항목에서 캐스팅 C 스타일의 캐스팅을 사용하고, 인스턴스를 생성하지 않습니다.

항목이 NULL이면 메서드를 호출하면 seq 오류가 발생합니다.

그렇지 않으면 답을 얻기 위해 예제에서 아직 자세하지 않은 세부 정보가있는 것처럼 보입니다.

+0

XtPointer item 이제 ... 고마워! (선명도가 부족함을 다소 설명하기 위해 레거시 코드를 사용하고 있습니다. 푸시 버튼을 누르면 컴파일이 완료됩니다.이를 정리하거나 이해하는 데 별다른 노력이 필요하지 않습니다. 지식의 부족.) – glazedandconfused

0

.h 파일에서 변수를 선언 했으므로 두 개의 복사본이 있습니다. 컴파일러는 .h 파일을 볼 수 없으며 파일의 내용을 .C 파일에 복사/붙여 넣기하므로 변수의 복사본이 두 개 있습니다.

변수를 .h 파일에 extern으로 선언하고 하나의 .C 파일에만 extern없이 선언 한 다음 해당 파일의 선언에 static을 사용하지 마십시오. 문제가 해결됩니다.

+0

친절하게 고맙습니다. - 이렇게하면 '오류 : 저장소 클래스가 로그에 지정되었습니다'라는 메시지가 나타납니다. 나는 그것을 보았다. 그리고 내가 그것을 찾고있는 나의 .h 어딘가에서 문제가있을 것 같아 보인다. 다시 고맙습니다. – glazedandconfused

+0

http : //cboard.cprogramming.co.kr/c-programming/113962-my-error-storage-class-specified-parameter.html 은 내가 향후에 참조 할만한 누구나 참조할만한 링크입니다. – glazedandconfused