2013-09-01 3 views
1

Я пытаюсь реализовать шаблон для состояний машин в C++, но я не уверен, как обращаться с элементами статического объекта. Каждая машина состояний будет определяться ее переменными состояния и ее переходами (которые являются структурами). Например:Инициализация статического члена-объекта

// stm.h 

template <class T> 
struct transition 
{ 
    ... transition relevant data depending on state variables T ... 
}; 

template <class T> 
class stm 
{ 
    T *stv; // state variables 
    static struct transition<T> *transitions; // I would like to have only one copy of transitions for stm's of type T 
    ... etc ... 
}; 

Теперь предположим, что я пытаюсь реализовать СтМ Foo:

// foo_defs.h 

struct foo_stv 
{ 
    char a; 
    int b; 
}; 

// foo_transitions.h 
// Note that I'm using a different file to keep everything in order 

#include "stm.h" 
#include "foo_defs.h" 

struct transition<struct foo_stv> foo_transitions[] = 
{ 
    { ... trans1 ... }, 
    ..., 
    { ... transN ... } 
}; 

// foo_stm.h 

#include "stm.h" 
#include "foo_defs.h" 
#include "foo_transitions.h" 

class foo_stm 
{ 
    stm<struct foo_stv> stm; 
    struct foo_stv stv; 
    ... other data ... 
}; 

Ok. Поэтому каждый экземпляр foo_stm должен иметь другой набор переменных состояния, но все экземпляры должны использовать одни и те же переходы. Вопрос в том, как мне определить/объявить stm<struct foo_stv>, чтобы использовать foo_transitions в качестве своего класса transitions участник?

Также приветствуются любые советы о соблюдении правил кодирования на C++, поскольку я исхожу из мира кодирования C и начинаю работать с некоторыми механиками C++.

EDIT: Просто чтобы очистить мой вопрос, я думаю, вы должны забыть о логике СтМа и сосредоточить внимание на следующем: Что такое правильный способ сделать что-то вроде ...

foo_stm::stm.transitions = foo_transitions; 
+0

Почему нет одноэлементного шаблона? Проблема будет в том, что вы не можете инициализировать статический член, кроме как в cpp, OR, если вы используете недавний C++. – dzada

+1

* «Также приветствуем любые советы о традициях кодирования на C++, поскольку я пришел из мира кодирования C и просто начал работу с некоторыми механиками C++ *« ОК: ключевое слово 'struct' не требуется в C++ (я говорю о предложениях типа' stm '. Единственное различие между' class' и 'struct' заключается в том, что область полномочий по умолчанию для класса является частной, в структуре открыто. – Manu343726

+0

« каждый экземпляр foo_stm должен иметь другой набор переменных состояния, но все экземпляры должны использовать одни и те же переходы ». Как вы можете иметь разные переменные состояния и одни и те же переходы? – BartoszKP

ответ

2

Все правого Я думаю, что то, что вы хотите сделать, это:

template <class T> 
class stm 
{ 
    T *stv; 
    static transition<T> *transitions; 
}; 

template<class T> 
transition<T>* stm<T>::transitions; //define static template member 

И потом:

//define static member for particular template instantiation 
template<> 
transition<foo_stv>* stm<foo_stv>::transitions = foo_transitions; 

class foo_stm 
{ 
    stm<struct foo_stv> stm; 
    struct foo_stv stv; 
    ... other data ... 
}; 
+0

Интересно, я попробую это, когда вернусь домой. Я пытаюсь справиться в контексте ООП, но не привык к нему. Где я терпеть неудачу? – user2553780

+1

Я постараюсь дать вам более подробный ответ в ближайшее время, извините за задержку. – BartoszKP

+1

Хорошо, я проанализировал ваше решение более подробно, и я думаю, что это нормально, в контексте программирования шаблонов. То, что я видела неправильно в последний раз, заключалось в том, что вы немного злоупотребляете ключевым словом «struct» (C-style), и это немного портило мое видение :-) Предполагая, что ваша структура 'перехода' содержит пару и, возможно, некоторые дополнительные данные о переходе все выглядят нормально. Извините за вводящий в заблуждение комментарий в моем предыдущем ответе. – BartoszKP

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