Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
#1

Замена экземпляра структуры для подачи в качестве аргумента - C++

02.02.2015, 20:09. Просмотров 361. Ответов 9
Метки нет (Все метки)

Интересует есть ли способ замены экземпляра структуры для подачи в функцию.
Т.е. если я создаю собственную структуру(естественно с другими именем), то можно ли ею подменить требуемую.

Пример: есть структура "WNDCLASS WndClass" (в WinApi), её экземпляр подаётся в качестве аргумента в функцию "RegisterClass(&WndClass)".
Так вот, допустим у меня есть собственная структура "MyStruct StructClass", с помощью указателей и т.п. я создам и заполню поля так, как это в оригинальной структуре "WNDCLASS", как её передать в функцию "RegisterClass".

Может если структурой нельзя, то может массивом или чем то ещё? Может можно обойти с помощью шаблона(template)?..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2015, 20:09     Замена экземпляра структуры для подачи в качестве аргумента
Посмотрите здесь:

C++ Создать класс для реализации комплексных чисел в алгебраической форме. Используя функции с объектом в качестве аргумента
C++ Добавление экземпляра структуры в конец коллекции
Функция в качестве аргумента C++
C++ Передача функции в качестве аргумента массив
Передача двухмерного массива в качестве аргумента C++
Использование массивов в качестве аргумента функции C++
Передача символьного массива в качестве аргумента C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
02.02.2015, 21:53     Замена экземпляра структуры для подачи в качестве аргумента #2
Izual, если правильно понял, то просто каст
C++
1
2
MyStruct StructClass;
RegisterClass(reinterpret_cast<WNDCLASS *>(&StructClass));
Добавлено через 2 минуты
Ну и ещё наверное могут быть проблемы с различным выравниванием...
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
02.02.2015, 22:28  [ТС]     Замена экземпляра структуры для подачи в качестве аргумента #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну и ещё наверное могут быть проблемы с различным выравниванием
Это всё будет естественно учтено.
Каст придётся писать статически (указывая явно имя структуры WNDCLASS), а можно ли без статического указания?..
И ещё сразу наводящий вопрос, т.к. я буду использовать Сишные функции через template, то может мне вообще не надо заморачиваться с приведением типа?.. Т.е. просто создать свой поинтер, выделить опр. кол-во памяти под его размер(столько же, сколько и оригинальная структура должна весить) ну и заполнить через указатели соотв. "типа" члены, но по факту просто ячейки памяти. Ну и просто передать этот указатель с типом void, ведь наверно? ему пофиг какой тип.. Главное чтоб порядок аргументов был..
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
02.02.2015, 22:40     Замена экземпляра структуры для подачи в качестве аргумента #4
Цитата Сообщение от Izual Посмотреть сообщение
Каст придётся писать статически (указывая явно имя структуры WNDCLASS), а можно ли без статического указания?.
Да, таков С++, типы должны быть известны до компиляции
Цитата Сообщение от Izual Посмотреть сообщение
И ещё сразу наводящий вопрос, т.к. я буду использовать Сишные функции через template, то может мне вообще не надо заморачиваться с приведением типа?.. Т.е. просто создать свой поинтер, выделить опр. кол-во памяти под его размер(столько же, сколько и оригинальная структура должна весить) ну и заполнить через указатели соотв. "типа" члены, но по факту просто ячейки памяти. Ну и просто передать этот указатель с типом void, ведь наверно? ему пофиг какой тип.. Главное чтоб порядок аргументов был..
Можно конечно любой указатель передать, только в С++ нужен будет каст к соответствующему типу (здесь WNDCLASS *), в С не обязательно если будете void * в ф-ю передавать; только мне не особо понятно как это будете в "динамике разруливать" и зачем это нужно...
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
02.02.2015, 22:44  [ТС]     Замена экземпляра структуры для подачи в качестве аргумента #5
Цитата Сообщение от gray_fox Посмотреть сообщение
в "динамике разруливать" и зачем это нужно
Второе указывает на первое, а ответ на первый вопрос - парсинг самый обычный.
Смутило что вы сказали, что мол "в С++ нужно"... мне кажется что шаблон с указателем на функцию позволит мне это сделать. Ладно, в общем спасибо за ответ, буду тестировать через обычные void pointers, а там уж видно будет что получится из этого.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
02.02.2015, 22:53     Замена экземпляра структуры для подачи в качестве аргумента #6
Цитата Сообщение от Izual Посмотреть сообщение
Смутило что вы сказали, что мол "в С++ нужно"...
Если про передачу указателей как параметр ф-ии, то это я о том, что в С void * кастуется неявно в любому указателю (в не последнюю очередь потому что нет типизированного new, как в С++), в то время как в С++ - нет.
Убежденный
Системный программист
Эксперт С++
15099 / 6794 / 1073
Регистрация: 02.05.2013
Сообщений: 11,105
Завершенные тесты: 1
02.02.2015, 23:05     Замена экземпляра структуры для подачи в качестве аргумента #7
Можно унаследоваться от нужной структуры и добавить свои поля.
Так, например, может "наращиваться" OVERLAPPED при передаче в
I/O completion port: сначала идут стандартные поля, а потом свои.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
02.02.2015, 23:39  [ТС]     Замена экземпляра структуры для подачи в качестве аргумента #8
Цитата Сообщение от gray_fox Посмотреть сообщение
типизированного new, как в С++
А это:
C++
1
2
void* ptr = operator new(size);
operator delete(ptr);
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно унаследоваться от нужной структуры и добавить свои поля.
Это эквивалентно тому, что мне придётся статически писать имя нужной структуры(от которой пляшу), а это уже не динамика. Не подходит.
Буду делать через обычные pointers, только вот прежде чем начну это делать, ещё надо кучу всего написать...

Не по теме:

Блин, жалко что нет 10 рабов (с развитым интеллектом)

gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
02.02.2015, 23:46     Замена экземпляра структуры для подачи в качестве аргумента #9
Цитата Сообщение от Izual Посмотреть сообщение
А это:
Наборот: void * -> T *
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2015, 23:52     Замена экземпляра структуры для подачи в качестве аргумента
Еще ссылки по теме:

C++ Как не писать один и тот же код, для функции, принимающей разные типы данных в качестве аргумента
C++ Передача матрицы в метод в качестве аргумента
C++ Шаблон в качестве аргумента метода(функции)
C++ Передача массива в качестве аргумента функции
C++ Использование массива в качестве аргумента функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
02.02.2015, 23:52  [ТС]     Замена экземпляра структуры для подачи в качестве аргумента #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Наборот
Не суть, главное что можно выделить область памяти и там уже указателем распределить данные)
Да и это я за пол минуты нагуглил(т.к. раньше с таким не сталкивался), потому даже не вникал ещё в синтаксис...

Не по теме:

Спать хотел лечь, да полная луна в голову светила,.. насветила походу, опять беЗсонная ночь творчества...

Yandex
Объявления
02.02.2015, 23:52     Замена экземпляра структуры для подачи в качестве аргумента
Ответ Создать тему
Опции темы

Текущее время: 02:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru