Проблема области видимости переменной файла заголовка C ++ - PullRequest
0 голосов
/ 15 июля 2010

У меня есть 3 файла, которые относятся к этой проблеме. file.h, file.C и user.C.

file.h имеет закрытого пользователя, fstream logs.

В конструкторе файла .C он открывает логи. Это не делается в конструкторе, но конструктор вызывает функцию OpenLog ().

file.h также имеет встроенную функцию закрытия:

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

Файл user.C имеет функцию выхода, которая создает экземпляр файла, а затем вызывает CloseLog. Это вызывает ошибки в этой точке. Я создал несколько других фиктивных тестов, и кажется, что журналы где-то теряются в миксе ...

Переход от file.C к user.C и затем обратно к file.C вызывает это. Если в файле file.C есть журналы fstream как глобальные, то это работает, но я бы предпочел избегать глобальных.

Есть мысли о том, что мне здесь делать? Пожалуйста, дайте мне знать, если я должен выложить больше кода об этом, я могу настроить некоторые фиктивные вещи, чтобы лучше показать это.

** Вот больше кода, как и было запрошено - я не могу копировать и вставлять, поэтому простите за его отсутствие, пожалуйста, **

Я буду называть классы helpME.h, helpME.C и user.C

// helpME.h
#ifndef _helpME_H
#define _helpME_H

# include
#include
// различные включает в себя

класс helpME {
частное:
журналы fstream;

общественность:
void CloseLog () {if (logs) logs.close ();}
};
# ENDIF

// конец helpME.h

// helpME.C
void helpME :: helpME (int argc, char ** argv)
{
// различный код
OpenLog ();
}

void helpME :: OpenLog ()
{
// logname установлен выше, у меня был оператор печати, который показал, что это правильно
logs.open (логин, ios :: in | ios :: out | ios :: trunc);
}

// конец helpME.C

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

// Конечный пользователь. C

Опять же - пожалуйста, простите за отсутствие ясности, я думаю, что я, возможно, просто запутал вещи, добавив это ... этот код находится в другом окне и не может быть скопирован.

Ответы [ 2 ]

0 голосов
/ 15 июля 2010
void user::quitHelpME(item)
{
helpME* hME = (helpME*) item;

Это не создает экземпляр, он использует приведение в стиле C для приведения любого объекта к указателю на helpME.

если элемент равен NULL, то вызов метода для него приведет к ошибке.

В противном случае в вашем примере все еще недостаточно подробностей, чтобы дать вам ответ, код кажется правильным.

0 голосов
/ 15 июля 2010

Поскольку вы объявили свою переменную в файле .h, у вас есть две ее копии.Компилятор не «видит» файлы .h, он просто копирует / вставляет то, что находится в файле, в файлы .C, поэтому у вас есть две копии переменной.

Объявите переменную какextern в .h файле, и объявите его снова без extern только в одном файле .C и не используйте static в любом объявлении этого файла. Это должно решить вашу проблему.

...