Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура с членами-функциями, для чего это и чем чревато? 
V
    Опции темы
ksili
Дата 21.4.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



В программе (не моей) есть 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-ка, которая должна внедряться в появляющиеся окна (свои и чужие) то ли не внедряется, то ли не выполняет свои функции.

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
mrbrooks
Дата 21.4.2009, 09:22 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



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

в С++ ни в чем - кроме того, что по умолчанию все члены/ методы структуры public.
PM MAIL   Вверх
zim22
Дата 21.4.2009, 09:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



ещё одно отличие структуры от класса - разный спецификатор доступа при дефолтном наследовании.
Код

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

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



--------------------
PM MAIL   Вверх
ksili
Дата 21.4.2009, 09:42 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
azesmcar
Дата 21.4.2009, 09:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

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

Ничего. Структура в С++ это тот же класс, только по умолчанию все члены открыты и наследование от него идет открыто (тоже по умолчанию).
А конструктор, деструктор, копирующий конструктор и оператор присваивания для структуры генерируются (если не написаны и используются) также как и для класса.
PM   Вверх
Andrey44
Дата 21.4.2009, 09:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



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

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



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
ksili
Дата 21.4.2009, 10:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



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

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

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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
azesmcar
Дата 21.4.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



ksili

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

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

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

struct mystruct
{
   WCHAR _url[512];
}

и
Код

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

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

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

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

ваше воспирятие smile
PM   Вверх
zim22
Дата 21.4.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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

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


--------------------
PM MAIL   Вверх
ksili
Дата 21.4.2009, 10:20 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



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

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

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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
mes
Дата 21.4.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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


Это сообщение отредактировал(а) mes - 21.4.2009, 10:23


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 21.4.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

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

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

Ответный вопрос..а что может произойти при создании экземпляров класса из разных потоков?
Ничего если конструктор не обращается к глобальным переменным, если обащается возможно понадобится синхронизация.
PM   Вверх
mes
Дата 21.4.2009, 10:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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

Это сообщение отредактировал(а) mes - 21.4.2009, 10:36


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1169 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.