Вопрос: Передача структуры в метод класса... | Добавлено: 10.05.06 02:29 |
Автор вопроса: ![]() |
Собственно, как известно, нельзя вызвать метод класса, где в качестве аргумента - структура. А так же сами структуры в классах объявлять как Public - нельзя. Мне это нужно обойти, и передать методу класса извне в аргументе структуру. Как это сделать? |
Ответы | Всего ответов: 25 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 58 Ответов: 4255 ![]() |
Профиль | Цитата | #1 | Добавлено: 10.05.06 11:27 |
нельзя вызвать метод класса, где в качестве аргумента - структура
О каком языке программирования идет речь? (VB6/NET) |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #2 | Добавлено: 10.05.06 11:32 |
как известно, нельзя вызвать метод класса, где в качестве аргумента - структура
Откуда это известно? Мне, например, нет А так же сами структуры в классах объявлять как Public - нельзя.
Если класс не Private - то кто мешает? В общем, учить матчасть! |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #3 | Добавлено: 10.05.06 15:53 |
А так же сами структуры в классах объявлять как Public - нельзя. Мне это нужно обойти...
1) объявить как Public (если можно) не в структуре... в отдельном модуле.. 2) Долгая и геморная работа с указателями, которых в ВБ, по мнению большинства, - нет. Они есть, просто спрятаны от всяких там "Hello World'истов"... P.S. Когда то в Си++ так хотел... тоже что-то неполучалось, хотя там указатели и не спрятаны ![]() ![]() ![]() P.S.S. Лучше поискать другие пути решения проблемы... |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #4 | Добавлено: 10.05.06 16:16 |
Еще раз - структуры объявляются как Public и передаются как аргументы при декларации в любом Public классе. Ибо дело не в разбросе её членов, а в том что эта структура в вызываемом классе имеет неплохие шансы просто напросто быть неописанной. То есть, неизвестный тип данных. Компилятор не допускает подобной ерунды.
Для примера возьми ту же коллекцию - ты не сможешь в неё засунуть приватный тип, поскольку этот тип не приводится к типу Variant - и, потенциально, ты можешь передать его за пределы класса/проекта, что попросту недопустимо. Так что для любого активикс приложения достаточно объявить тип в публичном классе, а для стандартного EXE и смысла в этом нет. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 302392161 Вопросов: 2 Ответов: 28 |
Профиль | Цитата | #5 | Добавлено: 10.05.06 16:48 |
Поторопился я с вопросом, забыл о передаче структуры по указателю. Теперь, разумеется, вопрос решен.
О каком языке программирования идет речь? (VB6/NET)
О VB6. Долгая и геморная работа с указателями
Это почему же? Работать с указателями более чем просто, собственно, как и с памятью. Не вижу никаких оснований для таких заявлений. Еще раз - структуры объявляются как Public и передаются как аргументы при декларации в любом Public классе.
Учи матчасть, и думай, перед тем как говорить. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #6 | Добавлено: 10.05.06 17:20 |
Поторопился я с вопросом
Эт верно, тебе бы сначала азы VB подучить надо, а потом уж на структуры замахиваться. Это почему же? Работать с указателями более чем просто
Да ну? Ну значит гений ты непризнанный. Все тут, понимаишь, считают это геморным патамушта VB не позволяет работать с указателями в принципе. Про ByRef и VarPtr не надо, умоляю... Учи матчасть, и думай, перед тем как говорить.
У тебя есть что возразить на это? Как я уже говорил, учить матчасть срочна! В поиске найдешь ссылки на мануалы по VB. Советую начать с Введения. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 302392161 Вопросов: 2 Ответов: 28 |
Профиль | Цитата | #7 | Добавлено: 10.05.06 17:30 |
2 LamerOnLine
Видимо, для таких как ты, об этом надо сказать: Это я: http://bbs.vbstreets.ru/profile.php?mode=viewprofile&u=5332&sid=19b45f8a1ac5787e8a29c0803e8472af Это тоже я: http://forum.sources.ru/index.php?showuser=23565 5 лет программирую на Basic-подобных языках и Borland C++, из них 3 с половиной года на VB, год на PowerBASIC. Не тебе меня учить, не позорься. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #8 | Добавлено: 10.05.06 17:36 |
Ну и к чему ты это привел?
Не тебе меня учить, не позорься.
Полный :lol: Человек, который программирует 3 с половиной года на VB пишет Собственно, как известно, нельзя вызвать метод класса, где в качестве аргумента - структура.
А так же сами структуры в классах объявлять как Public - нельзя.
Ржунимагу! Ты случаем не фокусник? Извини, но не верю я что программист даже с трехлетним стажем може написать такую чушь. И потом её еще отстаивать ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 302392161 Вопросов: 2 Ответов: 28 |
Профиль | Цитата | #9 | Добавлено: 10.05.06 17:55 |
Надеюсь, ты различаешь класс и пользовательские типы, а следовательно и то, что именно подразумевалось под структурой.
Выполни этот код: 'Код класса
Option Explicit Public Type SomeStruct var1 As Long var2 As String * 255 var3() As Byte End Type Public Function SomeFunc(ByRef SS As SomeStruct) As Long ' SomeFunc = 1 End Function |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #10 | Добавлено: 10.05.06 18:04 |
Ну ты додумался - указать строку фиксированного размера. Замени её на String или () as Byte - и все выполнится ![]() Тут проблема то в другом крылась ![]() |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 302392161 Вопросов: 2 Ответов: 28 |
Профиль | Цитата | #11 | Добавлено: 10.05.06 18:11 |
Ну ты додумался - указать строку фиксированного размера. Замени её на String или () as Byte - и все выполнится
![]() Хм... Видимо, у нас разные компиляторы, ибо мой выдаёт ошибку "Cannot define a Public user-defined type within a private object module" - независимо от содержания структуры. Аналогично и с функцией - "Private Enum and user-defined types cannot be used as parameters or return types for public procedures…" |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #12 | Добавлено: 10.05.06 18:23 |
Жесть... Начиная с самого первого ответа я твердил одно - класс не может быть Private!
В общем, так 1. Создаешь новый проект, ActiveX.exe либо ActiveX.dll (ну или еще какой хечешь), свойство Instancing первого класса дефолтовое - MultiUse, копируешь туда код, компилишь - и все ок. Ну а то что Public типы в объектных модулях имют свои ограничения - надеюсь ты не открыл Америку ![]() ВБ - это COM язык, если параметр не поддерживается Automation - в VB с ним будет сложновато. Забавы ради - попробуй из C++ вернуть в VB простой байтовый массив char[] вместо SAFEARRAY или BSTR... |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 302392161 Вопросов: 2 Ответов: 28 |
Профиль | Цитата | #13 | Добавлено: 10.05.06 19:31 |
Мда... Я хотел было дописать строку "Никакого отношения к GlobalMultiUse это не имеет", ибо знал, что ты именно так и ответишь.
Речь идёт _именно_ о тех ограничениях пользов. типов в классах, которые решаются за счёт передачи указателя структуры, а не самой структуры. Кроме того, мне нужно передавать структуры в несколько классов одновременно, в несколько _приватных_ классов, где и возникают те проблемы, о которых я упомянул в вопросе. Насчёт формата VB строки - не вижу никаких проблем. Обрезание нулевого символа в конце и конвертация в Юникод. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 302392161 Вопросов: 2 Ответов: 28 |
Профиль | Цитата | #14 | Добавлено: 10.05.06 19:35 |
Offtop: Кстати, на этом форуме реально править свои сообщения? |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #15 | Добавлено: 10.05.06 21:12 |
>offtop
нет. Это почему же? Работать с указателями более чем просто, собственно, как и с памятью. Не вижу никаких оснований для таких заявлений.
при этом... 5 лет программирую на Basic-подобных языках и Borland C++, из них 3 с половиной года на VB, год на PowerBASIC.
Не тебе меня учить, не позорься. не позорься - вот именно. Если умеешь - молодец, но ненадо говорить "более чем просто", а то аж глаза режит... по поводу ссылок на свой профиль и на кое-то там сообщение из другого форума - понт. я на стрите скромный RUSYA :/ Почти такой же как BV на VBNet'e... только с народом там общаюсь чуть осторожней, без всяких Не тебе меня учить
Релизуй то, что ты хочешь от VB на Си - на те же грабли наступишь. Если структура не объявлена в классе, то работать с этой структурой в том классе, в котором она не объявлена будет сложно (ИМХО + больше к VB отношу... Спор насчёт Си я вести не в состоянии, из за нехватки знаний) |
|