Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Структура с членами-функциями


Автор: ksili 21.4.2009, 09:18
В программе (не моей) есть h-файл, содержащий такие строки:
Код

typedef struct tagFWFAULTENTRY
{
    bool _gotSolutionUrl;

    WCHAR _url[512];
    HWND m_hWnd;
    HWND m_hErrorDetailsWindow;
    WCHAR m_wzProblemEventName[64];
    WCHAR m_wzAppVersion[64];
    WCHAR m_wzModuleName[64];
    WCHAR m_wzModuleVersion[64];
    WCHAR m_wzExceptionOffset[64];
    WCHAR m_wzExceptionCode[64];

    WCHAR m_wzHangSignature[64];
    WCHAR m_wzHangType[64];

    WCHAR m_wzErrorDetails[1500];

    WCHAR m_wzExceptionInformation[1500];

    WCHAR m_wzOccured[100];

    WCHAR m_wzDialogType[255];

    WCHAR m_wzWinStyle[80];

    WCHAR m_wzAppTime[32];
    WCHAR m_wzModuleTime[32];

    WCHAR  m_wzWindowTitle[WINDOW_TITLE_LENGTH];
    WCHAR  m_wzWindowText[WINDOW_TEXT_LENGTH];

    WCHAR m_wzScreenShotPath[MAX_PATH];

    WCHAR m_wzApplicationPath[MAX_PATH];

    WCHAR m_wzVendorRaw[MAX_PATH];
    WCHAR m_wzCopyrightString[MAX_PATH];

    WCHAR m_wzApplicationName[MAX_PATH];

    POINT m_ptBodyTextStart;// absolute position of the start of body text

    FWBUTTONINFO m_btButtons[BUTTONS_MAX_COUNT];
    int m_iFocused;

    bool m_bDialogControl;

    void Init()
    {
        ZeroMemory(this, sizeof(FWFAULTENTRY));
        m_iFocused = 0;
        for (int i = 0; i < BUTTONS_MAX_COUNT; i++)
        {
            *(m_btButtons[i].Text) = 0;
            m_btButtons[i].Style = 0;
            m_btButtons[i].Position.x = 0;
            m_btButtons[i].Position.y = 0;
        }
    }

    void AddButtonText(WCHAR* text, POINT &position, bool isFocused, int style)
    {
        for (int i = 0; i < BUTTONS_MAX_COUNT; i++)
            if (!*(m_btButtons[i].Text))
            {
                wcscpy_s(m_btButtons[i].Text, BUTTON_TEXT_LENGTH, text);
                m_btButtons[i].Position = position;
                m_btButtons[i].Style = style;
                if (isFocused)
                    m_iFocused = i + 1;
                break;
            }
    };
} FWFAULTENTRY;

то есть в структуре есть две функции. Зачем это было надо городить? В чём отличие от класса? Что может нехорошего произойти при создании экземпляров такой структуры из разных потоков?

Я интересуюсь этим, т.к. данный код используется в dll, которая внедряется в другие процессы и, как показало логгирование, на строке
Код

FWFAULTENTRY fwData;

происходит, что-то нехорошее. Приложение (мое, оконное) продолжает вроде работать, не виснет и никаких окошек с ошибками не вылетает. Но вот dll-ка, которая должна внедряться в появляющиеся окна (свои и чужие) то ли не внедряется, то ли не выполняет свои функции.

Происходит это не на первом и не на втором вхождении в такую строку.

Автор: mrbrooks 21.4.2009, 09:22
Цитата(ksili @  21.4.2009,  09:18 Найти цитируемый пост)
Зачем это было надо городить? В чём отличие от класса? 

в С++ ни в чем - кроме того, что по умолчанию все члены/ методы структуры public.

Автор: zim22 21.4.2009, 09:37
ещё одно отличие структуры от класса - разный спецификатор доступа при дефолтном наследовании.
Код

struct X;
struct S : X // аналог struct S : public X

class X;
class S : X // аналог class S : private X

Автор: ksili 21.4.2009, 09:42
Что же может произойти плохого при создании такого объекта? Конструктора же вроде нет. Просто выделяется память?

Автор: azesmcar 21.4.2009, 09:47
Цитата

Что же может произойти плохого при создании такого объекта? Конструктора же вроде нет. Просто выделяется память? 

Ничего. Структура в С++ это тот же класс, только по умолчанию все члены открыты и наследование от него идет открыто (тоже по умолчанию).
А конструктор, деструктор, копирующий конструктор и оператор присваивания для структуры генерируются (если не написаны и используются) также как и для класса.

Автор: Andrey44 21.4.2009, 09:48
Цитата(ksili @  21.4.2009,  09:42 Найти цитируемый пост)
Что же может произойти плохого при создании такого объекта?

Ну напишите вместо struct  - class, и и обьявите все члены public. 

Автор: ksili 21.4.2009, 10:08
Цитата(azesmcar @  21.4.2009,  13:47 Найти цитируемый пост)
Ничего.

как это ничего? вот например, член структуры: 
WCHAR _url[512];
для него память не нужна? Я ж не говорю, что она выделяется динамически.

Цитата(Andrey44 @  21.4.2009,  13:48 Найти цитируемый пост)
Ну напишите вместо struct  - class, и и обьявите все члены public. 

Что это изменит?

Автор: azesmcar 21.4.2009, 10:13
ksili

Еще раз говорю.
Структура и класс в С++ - абсолютно тоже самое. Никакой разницы, структура или класс. Если работает в классе, будет работать и в структуре.
Цитата

WCHAR _url[512];
для него память не нужна? Я ж не говорю, что она выделяется динамически.

нужна, и она выделяется.
Код

struct mystruct
{
   WCHAR _url[512];
}

и
Код

class mystruct
{
public:
   WCHAR _url[512];
}

тоже самое, будут работать они одинаково, никакой разницы в использовании за исключением описанного выше.

Добавлено через 28 секунд
Цитата

Что это изменит? 

ваше воспирятие smile

Автор: zim22 21.4.2009, 10:15
Цитата(ksili @  21.4.2009,  10:08 Найти цитируемый пост)
Что это изменит?

абсолютно ничего.

Автор: ksili 21.4.2009, 10:20
На вопрос
Цитата(ksili @  21.4.2009,  13:18 Найти цитируемый пост)
В чём отличие от класса?

ответили. Спасибо.

Но как насчёт
Цитата(ksili @  21.4.2009,  13:18 Найти цитируемый пост)
Что может нехорошего произойти при создании экземпляров такой структуры из разных потоков?

Собственно, ответ на него более интересен.

Автор: mes 21.4.2009, 10:23
Цитата(ksili @  21.4.2009,  09:20 Найти цитируемый пост)
Что может нехорошего произойти при создании экземпляров такой структуры из разных потоков?

Собственно, ответ на него более интересен. 

Вам уже неоднoкратно ответили : то же что если бы она была объявлена как класс.

Автор: azesmcar 21.4.2009, 10:26
Цитата

Но как насчёт
Цитата(ksili @  21.4.2009,  13:18 Найти цитируемый пост)
Что может нехорошего произойти при создании экземпляров такой структуры из разных потоков?

Собственно, ответ на него более интересен. 

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

Автор: mes 21.4.2009, 10:28
Цитата(ksili @  21.4.2009,  08:18 Найти цитируемый пост)
Структура с членами-функциями

Члены-функции являются членами структуры/класса, а не созданных объектов.
Т.е их декларации используется  для установления прав доступа и области видимости,
но они (члены-функции)  не присутствуют в созданных объектах, в отличии от членов-данных.

т.е объект (экземпляр) структуры, описанной с функциями, ничем не отличается от 
объекта структуры, описанной без членов-функций, и ничем не отличается от
объекта класса.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)