Название: Чем заменить enum Отправлено: iRQSX от Август 20, 2009, 23:24 Здраствуйте! Нужно сделать несколько плагинов и что бы различить их надо что бы каждый умел возвращать свой тип. В С# я бы использовал enum и возвращал бы его. Получилось бы что то типа
Код Как подобное замутить в С++? Чем можно заменить енум в таком случае? Название: Re: Чем заменить enum Отправлено: Alex Custov от Август 20, 2009, 23:38 Например:
Код
;) Название: Re: Чем заменить enum Отправлено: iRQSX от Август 20, 2009, 23:52 Сами то пробовали? G:/QProject/RecordViewer/recordviewer.cpp:27: error: `PluginType' is not a class or namespace
Может обернуть его в класс? Код
Название: Re: Чем заменить enum Отправлено: Alex Custov от Август 20, 2009, 23:54 ах да, "PT::" надо убрать.
Название: Re: Чем заменить enum Отправлено: iRQSX от Август 21, 2009, 00:00 В таком случае
Код: Creating library file: ..\Loader\debug\libRecordViewer.a Название: Re: Чем заменить enum Отправлено: Alex Custov от Август 21, 2009, 00:05 это уже проблемы проекта. Например, забыл вставить Q_OBJECT. Вообще, плагины можно организовать так:
1) Создать необходимые .h файлы с объявлением базового (как привило абстрактного) класса плагина, и всеми необходимыми типами данных (те ме же енумами) 2) Если необходимо, реализовать некоторые методы базового класса, чтобы они, например, выполняли действия по умолчанию 3) собрать это в динамическую библиотэку 4) собирать программу-контейнер и плагины напротив этой библиотеки Название: Re: Чем заменить enum Отправлено: iRQSX от Август 21, 2009, 00:18 Да Q_OBJECT нигде не вставлял поскольку не знаю где надо(кроме как в самом плагине):
Реализую похоже: 1. В библиотеку запихал интерфейс и этот енум, а так же класс для загрузки плагинов(это пока, потом больше будет) 2. Пока не надо 3. В отдельной либе сделал наследника интерфейса и от QObject, переопределил виртуальные функции из интерфейса, все работае плагин грузится его методы вызываются, проблема именно в том как вернуть тип плагина чтобы разместить его в нужном месте. Есть мысли где и что я пропустил? может выложить чего чтобы понятнее было? Название: Re: Чем заменить enum Отправлено: Alex Custov от Август 21, 2009, 00:29 куда вставлять Q_OBJECT написано в доке. Он вставляется если класс использует сигналы-слоты, например. Если енум с типом плагина уже есть в общей библиотеке, то всё уже готово. В библе у тебя будет:
Код
В плагине-наследнике: Код
В программе-контейнере: Код
Название: Re: Чем заменить enum Отправлено: iRQSX от Август 21, 2009, 00:36 Все понял. Вся загвоздка была в том что написал
virtual PluginType getType(); заместо virtual PluginType getType()=0; только до сих пор не понял почему без этого =0 не собирается... Огромное спасибо! Название: Re: Чем заменить enum Отправлено: iRQSX от Август 21, 2009, 01:46 Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить...
Название: Re: Чем заменить enum Отправлено: Alex Custov от Август 21, 2009, 02:11 Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить... В С++ нет энумераторов, вернее есть, но это совсем не то :) Видимо придётся пользоваться теми решениями. Название: Re: Чем заменить enum Отправлено: BRE от Август 21, 2009, 08:40 Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить... Ну тут на помощь может прийти moc. :)Посмотри обсуждение: http://www.forum.crossplatform.ru/index.php?showtopic=2326&pid=16643&st=0&#entry16643 Название: Re: Чем заменить enum Отправлено: spectre71 от Август 21, 2009, 08:43 Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить... enum PluginType { PluginTypeView=0, PluginTypeEdit=1 }; И проходи по циклу. Название: Re: Чем заменить enum Отправлено: Alex Custov от Август 21, 2009, 11:12 enum PluginType { PluginTypeView=0, PluginTypeEdit=1 }; И проходи по циклу. Если список возможных плагинов изменится, то всё нужно будет перекомпилировать. Если согласится на перекомпиляцию, то я когда-то делал Код
и соответственно цикл всегда можно крутить от 0 до PluginTypeOther Название: Re: Чем заменить enum Отправлено: kuzulis от Август 21, 2009, 12:25 Цитировать только до сих пор не понял почему без этого =0 не собирается... Потомучто это чисто виртуальный метод класса, поэтому: 1. Если хочешь, чтобы оно собралось без = 0, необходимо реализовать ее в *.cpp ЭТОГО ЖЕ класса 2. Если ставиш = 0 , то означает, что этот метод в данном классе реализован не будет! А будет реализован в классах-наследниках ЗЫ: читай С++ :) Название: Re: Чем заменить enum Отправлено: iRQSX от Август 23, 2009, 03:40 А вот это как раз промеж глаз и попалось, почему то демал что достаточно virtual написать...
|