Russian Qt Forum
Ноябрь 24, 2024, 14:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Чем заменить enum  (Прочитано 13322 раз)
iRQSX
Гость
« : Август 20, 2009, 23:24 »

Здраствуйте! Нужно сделать несколько плагинов и что бы различить их надо что бы каждый умел возвращать свой тип. В С# я бы использовал enum и возвращал бы его. Получилось бы что то типа
Код
C++ (Qt)
enum PT {View, find, edit}
 
PT MyClass::getType()
{
return PT::View;
}
}
Как подобное замутить в С++? Чем можно заменить енум в таком случае?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Август 20, 2009, 23:38 »

Например:

Код
C++ (Qt)
enum PT {View, find, edit};
 
PT MyClass::getType()
{
return PT::View;
}
}
 

Подмигивающий
Записан
iRQSX
Гость
« Ответ #2 : Август 20, 2009, 23:52 »

Сами то пробовали? G:/QProject/RecordViewer/recordviewer.cpp:27: error: `PluginType' is not a class or namespace

Может обернуть его в класс?
Код
C++ (Qt)
class PluginType
{
public:
    enum PT { High, Low, VeryHigh, VeryLow };
};
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Август 20, 2009, 23:54 »

ах да, "PT::" надо убрать.
Записан
iRQSX
Гость
« Ответ #4 : Август 21, 2009, 00:00 »

В таком случае
Код:
Creating library file: ..\Loader\debug\libRecordViewer.a
debug/recordviewer.o: In function `ZN8QPointerI7QObjectEaSEPS0_':
c:/Qt/2009.03/qt/include/QtCore/../../src/corelib/kernel/qpointer.h:(.text$_ZN7IModuleD2Ev[IModule::~IModule()]+0xb): undefined reference to `vtable for IModule'
c:/Qt/2009.03/qt/include/QtCore/../../src/corelib/kernel/qpointer.h:(.text$_ZN7IModuleC2Ev[IModule::IModule()]+0x8): undefined reference to `vtable for IModule'
collect2: ld returned 1 exit status
mingw32-make[2]: *** [..\Loader\debug\RecordViewer.dll] Error 1
mingw32-make[1]: *** [debug] Error 2
mingw32-make: *** [sub-RecordViewer-make_default] Error 2
Завершено с кодом возврата 2.
Ошибка во время сборки проекта QProject
Во время выполнения сборки на этапе 'Make'
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Август 21, 2009, 00:05 »

это уже проблемы проекта. Например, забыл вставить Q_OBJECT. Вообще, плагины можно организовать так:

1) Создать необходимые .h файлы с объявлением базового (как привило абстрактного) класса плагина, и всеми необходимыми типами данных (те ме же енумами)
2) Если необходимо, реализовать некоторые методы базового класса, чтобы они, например, выполняли действия по умолчанию
3) собрать это в динамическую библиотэку
4) собирать программу-контейнер и плагины напротив этой библиотеки
Записан
iRQSX
Гость
« Ответ #6 : Август 21, 2009, 00:18 »

Да Q_OBJECT нигде не вставлял поскольку не знаю где надо(кроме как в самом плагине):
Реализую похоже:
1. В библиотеку запихал интерфейс и этот енум, а так же класс для загрузки плагинов(это пока, потом больше будет)

2. Пока не надо
3. В отдельной либе сделал наследника интерфейса и от QObject, переопределил виртуальные функции из интерфейса, все работае плагин грузится его методы вызываются, проблема именно в том как вернуть тип плагина чтобы разместить его в нужном месте.

Есть мысли где и что я пропустил? может выложить чего чтобы понятнее было?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Август 21, 2009, 00:29 »

куда вставлять Q_OBJECT написано в доке. Он вставляется если класс использует сигналы-слоты, например. Если енум с типом плагина уже есть в общей библиотеке, то всё уже готово. В библе у тебя будет:

Код
C++ (Qt)
enum PluginType { PluginTypeView, PluginTypeEdit };
 
class PluginBase
{
   public:
       ...
       virtual PluginType type() const = 0;
};
 

В плагине-наследнике:

Код
C++ (Qt)
#include <pluginbase.h>
 
class PluginView : public PluginBase
{
   public:
       ...
       virtual PluginType type() const { return PluginTypeView; }
};
 

В программе-контейнере:

Код
C++ (Qt)
// грузим плагины тут
PluginBase *plugin = PluginLoader::instance()->load("...../view.so");
 
PluginType t = plugin->type();
 
if(t == PluginTypeView)
{
   // вставляем туда-то
}
else if (t == PluginTypeEdit)
{
   ....
}
else if...
 
« Последнее редактирование: Август 21, 2009, 00:35 от AX » Записан
iRQSX
Гость
« Ответ #8 : Август 21, 2009, 00:36 »

Все понял. Вся загвоздка была в том что написал
virtual PluginType getType(); заместо
virtual PluginType getType()=0;
только до сих пор не понял почему без этого =0 не собирается...
Огромное спасибо!
Записан
iRQSX
Гость
« Ответ #9 : Август 21, 2009, 01:46 »

Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить...
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Август 21, 2009, 02:11 »

Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить...

В С++ нет энумераторов, вернее есть, но это совсем не то Улыбающийся Видимо придётся пользоваться теми решениями.
Записан
BRE
Гость
« Ответ #11 : Август 21, 2009, 08:40 »

Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить...
Ну тут на помощь может прийти moc.  Улыбающийся
Посмотри обсуждение: http://www.forum.crossplatform.ru/index.php?showtopic=2326&pid=16643&st=0&#entry16643
Записан
spectre71
Гость
« Ответ #12 : Август 21, 2009, 08:43 »

Но все таки по САБЖу, допустим я хочу пройтись по енуму в цикле или вывести его в строку? Решения есть в принципе но геморойные, по этому вот и думаю чем его заменить...

enum PluginType { PluginTypeView=0, PluginTypeEdit=1 };

И проходи по циклу.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Август 21, 2009, 11:12 »

enum PluginType { PluginTypeView=0, PluginTypeEdit=1 };

И проходи по циклу.

Если список возможных плагинов изменится, то всё нужно будет перекомпилировать. Если согласится на перекомпиляцию, то я когда-то делал

Код
C++ (Qt)
                                                   // fake
enum PluginType { PluginTypeView=0, PluginTypeEdit, PluginTypeOther };
 

и соответственно цикл всегда можно крутить от 0 до PluginTypeOther
« Последнее редактирование: Август 21, 2009, 12:35 от AX » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Август 21, 2009, 12:25 »

Цитировать
только до сих пор не понял почему без этого =0 не собирается...

Потомучто это чисто виртуальный метод класса, поэтому:

1. Если хочешь, чтобы оно собралось без = 0, необходимо реализовать ее в *.cpp ЭТОГО ЖЕ класса
2. Если ставиш = 0 , то означает, что этот метод в данном классе реализован не будет! А будет реализован в классах-наследниках

ЗЫ: читай С++ Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.218 секунд. Запросов: 23.