Как определить переменную глобальной для класса, по типу из другого .h файла?
За инфу премного благодарен.
PS
Тип определен так:
FTI2XX.h
typedef ULONG FT_STATUS;
ULONG - unsigned long
Класс из библиотеки? или ты что-то инкапсулируешь? Про типы не известные С++, то ты загнул.
ЗЫ: Хорошо что Green не видел...;)
Класс из библиотеки? или ты что-то инкапсулируешь? Про типы не известные С++, то ты загнул.
ЗЫ: Хорошо что Green не видел...;)
Про типы неизвестные С++ неправильно сформулировал... нестандартные имелось ввиду.
Нужно: переменная ftHandle в моем классе Fuhler, тип FT_HANDLE, через которую я имею доступ к устройству, после его открытия (устройства), функциям класса Fuhler она необходима для получения данных от устройства, т.е. каждая функция смогла бы получить через нее доступ к устройству. Как ее определить как переменную класса или ...???
#include "FTDI2XX.h"
.....
class CFuhler
{
FT_HANDLER ftHandle;
public:
....
CFuhler([color=green]/**/[/color] ) :ftHandle (NULL)
{
[color=green]/*процедуры инициализации или/и захвата ресурса*/[/color]
}[color=green]//но я бы их разделил (например в connect)[/color]
~CFuhler()
{
[color=green]/*скажем процедуры освобождения*/[/color]
}
HRESULT connect2([color=green]/*параметры инициализации*/[/color] )
{
[color=green]/*захват ресурса*/[/color]
}
};
... переклинило меня сегодня не подетски ...
private:
static FT_HANDLE ftHandle;
static FT_STATUS ftStatus;
Fuehler.obj : error LNK2001: unresolved external symbol "private: static unsigned long CFuehler::ftStatus" (?ftStatus@CFuehler@@0KA)
Fuehler.obj : error LNK2001: unresolved external symbol "private: static void * CFuehler::ftHandle" (?ftHandle@CFuehler@@0PAXA)
... переклинило меня сегодня не подетски ...
Если ты хочешь чтобы для всех экземпляров твоего класса был
всего один указатель на ресурс, то тогда используй static. Но для данного примера возникают сложности с захватом и освобождением ресурса (какой экземпляр должен освободить или захватить ресурс? можно реализовать класс CFT_HANDLE который и будет заниматься такими проблемами). А что бы то что ты пишешь работало нужно объявить саму переменную. Ведь (см выше) этот один экземпляр располагается в глобальной области, и тебе необходимо его определить как глобальную переменную, т.е. после кода твоего класса:
/*такие переменные можно использовать и без создания класса -
просто указывая область (CFuhler::ftHandle), что в данном случае
опасно*/[/color]
...
int main(int argNum, char **argVar)
{
CFuhler::ftHandler=rtre;
[color=green]/*для данного случая это приведет к - остановке компиляции с
сообщением:Не могу получить доступ к private члену
CFuhler::ftHandler*/[/color]
}
всего один указатель на ресурс, то тогда используй static. Но для данного примера возникают сложности с захватом и освобождением ресурса (какой экземпляр должен освободить или захватить ресурс?
Какие сложности? Мне нужен один единственный хэндлер который я получаю при открытии устройства.
Чет я вообще в конец запутался, без класса все работает на ура, теперь все в класс упаковать... тупик.
Или я не в тот раздел запостил??? Все делается в Visual Studio 2005.
ЗЫ: Приведи код инициализации и освобождения ресурсов.
ЗЫ: Приведи код инициализации и освобождения ресурсов.
Fuehler.h
class CFuehler
{
public:
CFuehler();
virtual ~CFuehler();
private:
BOOL InitDevice();
private:
double m_nTempC;
double m_nSerieNr;
int m_nFuehlerCount;
public:
double GetTemperatur(int fuehlerNr);
CString GetSerieNr(int fuehlerNr);
private:
static FT_HANDLE ftHandle;
static FT_STATUS ftStatus;
};
Fuehler.cpp
#include "ftd2xx.h"
#include "Test1.h"
#include "Fuehler.h"
extern "C" __declspec(dllimport)char *TRM_GetData(FT_HANDLE ftHandle, char *RxBuffer);
extern "C" __declspec(dllimport)double TRM_GetTemperaturValueCelsius(char strInputValue[], int sensorIndex);
extern "C" __declspec(dllimport)int TRM_GetNumberOfSensors(char strInputValue[]);
CFuehler::CFuehler()
: m_nSerieNr(0)
, m_nTempC(0)
, m_nFuehlerCount(0)
{
CFuehler::InitDevice();
}
CFuehler::~CFuehler()
{
}
BOOL CFuehler::InitDevice()
{
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus == FT_OK)
{
ftStatus = FT_SetTimeouts(ftHandle,3000,1000);
if (ftStatus != FT_OK)
{
//MessageBoxA(" Error: Device not found! ");
return FALSE;
}
}
ftStatus = FT_ResetDevice(ftHandle);
if (ftStatus != FT_OK)
{
//MessageBox(" Error... ");
return FALSE;
}
ftStatus = FT_SetBaudRate (ftHandle, FT_BAUD_4800);
return TRUE;
}
С освобождением проще:
ЗЫ: Ты специально перемешиваешь private c public?;)
В общем я не правильно написал.
Устройство должно открываться/закрываться только ОДИН раз. ftHandle хэндлер устройства и функции-члены используют ftHandle для получения данных от устройства. Соответственно реализовывать захват/освобождение в конструкторе/деструкторе нельзя. То что в конструкторе стоит инициаализация это не совсем правильно т.к. пока это только тестовый прототип. Там этого не будет.
Нее. Так сама VS2005 делает когда добовляешь переменные или функции через Add ..., да это на данном этапе для меня и не особо важно, работало бы все, а там "оформим".
Примени паттерн "Singleton" (http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=31).
Примени паттерн "Singleton" (http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=31).
Я еще немного "невырос" до таких тонкостей, мне бы с функциями сделать, уже было бы неплохо на начальном этапе. У меня то всего 2 переменных...
Тем не менее за ссылку спасибо! В закладки положил.