Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как определить переменную глобальной для класса, по типу из другого .h файла?

20K
09 августа 2007 года
krist
33 / / 09.08.2007
Есть FTDI2XX.h и соответственно FTDI2XX.lib ( от УСБ конвертора ) там есть один тип FT_HANDLE мне нужна переменная этого типа известная всему классу. Как ее обозначить ума не приложу, тип неизвестный для С++...

За инфу премного благодарен.

PS
Тип определен так:
FTI2XX.h
Цитата:
typedef PVOID FT_HANDLE;
typedef ULONG FT_STATUS;

9.7K
09 августа 2007 года
DaemonDZK
59 / / 08.11.2005
PVOID это void*
ULONG - unsigned long
2.0K
09 августа 2007 года
WidowMaker
212 / / 05.04.2005
Уточни проблему, что значит "переменная известная всему классу"?
Класс из библиотеки? или ты что-то инкапсулируешь? Про типы не известные С++, то ты загнул.

ЗЫ: Хорошо что Green не видел...;)
20K
09 августа 2007 года
krist
33 / / 09.08.2007
Цитата: WidowMaker
Уточни проблему, что значит "переменная известная всему классу"?
Класс из библиотеки? или ты что-то инкапсулируешь? Про типы не известные С++, то ты загнул.

ЗЫ: Хорошо что Green не видел...;)


Про типы неизвестные С++ неправильно сформулировал... нестандартные имелось ввиду.

Нужно: переменная ftHandle в моем классе Fuhler, тип FT_HANDLE, через которую я имею доступ к устройству, после его открытия (устройства), функциям класса Fuhler она необходима для получения данных от устройства, т.е. каждая функция смогла бы получить через нее доступ к устройству. Как ее определить как переменную класса или ...???

2.0K
09 августа 2007 года
WidowMaker
212 / / 05.04.2005
Если ты говоришь о доступе к переменной через некоторую функцию-член класса, то логично, что переменная должна быть закрытым членом класса. К тому же судя по описанию это указатель. По твоим словам указатель на ресурс, значит не забуть про необходимую инициализацию и освобождение. Не пойму никак в чем проблема с объявлением класса:
Код:
....
#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]
    }
};
20K
09 августа 2007 года
krist
33 / / 09.08.2007
Спасибо.
... переклинило меня сегодня не подетски ...
Цитата:

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)

2.0K
10 августа 2007 года
WidowMaker
212 / / 05.04.2005
Цитата: krist
Спасибо.
... переклинило меня сегодня не подетски ...



Если ты хочешь чтобы для всех экземпляров твоего класса был
всего один указатель на ресурс, то тогда используй static. Но для данного примера возникают сложности с захватом и освобождением ресурса (какой экземпляр должен освободить или захватить ресурс? можно реализовать класс CFT_HANDLE который и будет заниматься такими проблемами). А что бы то что ты пишешь работало нужно объявить саму переменную. Ведь (см выше) этот один экземпляр располагается в глобальной области, и тебе необходимо его определить как глобальную переменную, т.е. после кода твоего класса:

Код:
HANDLE CFuhler::ftHandle=NULL;[color=green]
/*такие переменные можно использовать и без создания класса -
 просто указывая область (CFuhler::ftHandle), что в данном случае
опасно*/[/color]
...
int main(int argNum, char **argVar)
{
    CFuhler::ftHandler=rtre;
    [color=green]/*для данного случая это приведет к - остановке компиляции с
сообщением:Не могу получить доступ к private члену
CFuhler::ftHandler*/[/color]
}
20K
10 августа 2007 года
krist
33 / / 09.08.2007
Цитата: WidowMaker
Если ты хочешь чтобы для всех экземпляров твоего класса был
всего один указатель на ресурс, то тогда используй static. Но для данного примера возникают сложности с захватом и освобождением ресурса (какой экземпляр должен освободить или захватить ресурс?


Какие сложности? Мне нужен один единственный хэндлер который я получаю при открытии устройства.

Чет я вообще в конец запутался, без класса все работает на ура, теперь все в класс упаковать... тупик.

Или я не в тот раздел запостил??? Все делается в Visual Studio 2005.

2.0K
10 августа 2007 года
WidowMaker
212 / / 05.04.2005
Сложности касаются только варианта static.

ЗЫ: Приведи код инициализации и освобождения ресурсов.
20K
10 августа 2007 года
krist
33 / / 09.08.2007
Цитата: WidowMaker

ЗЫ: Приведи код инициализации и освобождения ресурсов.



Fuehler.h

Код:
#include "ftd2xx.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 "stdafx.h"
#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;
}

С освобождением проще:
 
Код:
FT_Close(ftHandle);
2.0K
10 августа 2007 года
WidowMaker
212 / / 05.04.2005
Тк у тебя конструктор каждый раз открывает устройство тебе незачем использовать статические члены, так что просто выкинь слово static из описания и все. Да и свой FT_Close положи или в деструктор или в скажем private: BOOL freeDevice(), а тот уже в деструктор

ЗЫ: Ты специально перемешиваешь private c public?;)
20K
10 августа 2007 года
krist
33 / / 09.08.2007
Цитата: WidowMaker
Тк у тебя конструктор каждый раз открывает устройство тебе незачем использовать статические члены, так что просто выкинь слово static из описания и все.



В общем я не правильно написал.
Устройство должно открываться/закрываться только ОДИН раз. ftHandle хэндлер устройства и функции-члены используют ftHandle для получения данных от устройства. Соответственно реализовывать захват/освобождение в конструкторе/деструкторе нельзя. То что в конструкторе стоит инициаализация это не совсем правильно т.к. пока это только тестовый прототип. Там этого не будет.

Цитата:
ЗЫ: Ты специально перемешиваешь private c public?;)


Нее. Так сама VS2005 делает когда добовляешь переменные или функции через Add ..., да это на данном этапе для меня и не особо важно, работало бы все, а там "оформим".

3
10 августа 2007 года
Green
4.8K / / 20.01.2000
Грамотная архитектура избавляет от многих проблем.
Примени паттерн "Singleton" (http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=31).
20K
10 августа 2007 года
krist
33 / / 09.08.2007
Цитата: Green
Грамотная архитектура избавляет от многих проблем.
Примени паттерн "Singleton" (http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=31).


Я еще немного "невырос" до таких тонкостей, мне бы с функциями сделать, уже было бы неплохо на начальном этапе. У меня то всего 2 переменных...

Тем не менее за ссылку спасибо! В закладки положил.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог