2015-10-06 6 views
1

Я переработан чуток мой код, так что мне нужно указатель, который может содержать несколько listę типов:Доступ к свойствам объекта указатель на Валу

owl_list = new Gee.LinkedList<OpenWithAction>(); 
a_list = new Gee.LinkedList<OpenAppAction>(); 

Gee.List* any_list = null; 

Так я есть указатель any_list, который я могу использовать для доступа к одному owl_list или a_list (в зависимости от переключателя нет здесь присутствует, но предположим, есть)

if (!any_list.size) 
    return null; 

но это потерпит неудачу, как valac бросает на меня error: The name `size' does not exist in the context of `Gee.List*' if (!any_list.size)

Я не сделал ny C, C++, так как очень долгое время, и я не эксперт по vala, так как я использую более бесхитростные языки, но есть ли способ, которым это могло бы работать?

EDIT:

Я просто попытался

fieldType = OpenWithAction.get_type(); 
if (!(any_list as Gee.List<fieldType>).size) 

error: The type name `fieldType' could not be found if (!(any_list as Gee.List<fieldType>).size) Очевидно, что я делаю что-то неправильно, то, что я пытаюсь сделать, это: Vala: determine generic type inside List at runtime, я просто не могу "т удается реализовать возвращение нулевой;

EDIT 2:.

Я только частично решена моя проблема:

Как сказал @ Jens-mühlenhoff, да OpenWithAction и OpenAppAction имеют общего предка, и это GLib.Action

Так что все я имел сделать, это объявить:

Gee.List<Action> any_list = null; 

вместо

Gee.List* any_list = null; 

Сейчас foreach (var action in any_list) работает, но я все еще получаю сообщение об ошибке с

if (any_list->size == null) 
    return null; 

error: The name `size' does not exist in the context of `Gee.List<Synapse.Action>?' if (any_list->size == null)

другой попробовать это:

if (!any_list.size) 
    return null; 

Operator not supported for `int' if (!any_list.size)

+0

Do OpenWithAction и OpenAppAction имеют общий супертип? –

+0

Я удивлен, что это компилируется вообще (как есть), потому что 'Gee.List ' является общим типом. –

+0

Я только что нашел то, что я пытаюсь сделать: http: //stackoverflow.com/questions/24710328/vala-determine-generic-type-inside-list-at-runtime Но у меня все еще возникают трудности с реализацией Это. Также он не компилирует – Kwaadpepper

ответ

0

Две вещи я делал неправильно:

1- Как и в C# я не должен был использовать указатель, если не требуется. Поэтому использование: Gee.List<Action> any_list = null; просто отлично работает.Объясняется это тем, что OpenWithAction и OpenAppAction имеют общий класс предков, поэтому объявление списка с этим типом просто отлично работает (с другой стороны, я не знаю, в случае, если у них не было общего предка) ,

2-INT тип не может быть использован в качестве BOOL типа так if (any_list.size == 0) будет работать тогда if (!any_list.size) будет выдавать ошибку

Спасибо каждый за помощь :)

0

any_list является указатель, поэтому вы не можете используйте оператор .. Попробуйте any_list->size.

+0

и я попробовал это: '' 'Operator не поддерживается для 'int ' if (! any_list-> size)' '' – Kwaadpepper

+0

Также, если я удаляю синтаксис указателя (*), я получил ошибку '' ': имя' size' не существует в контексте 'Gee .Список?' if (! Any_list-> size) '' ' – Kwaadpepper

+1

Да, вы не можете использовать'! 'Для integer. Попробуйте 'any_list-> size == 0'. – apmasell

Смежные вопросы