2013-03-11 4 views
1
void ChangeState(int newState) 
{ 
    nextState = newState; 

    //Change the state 
    switch(nextState) ///the change still will have a case for everything 
    { 
    case STATE_INTRO: 
    { 
     vec.pop_back(); 
     state ptr(new CIntroState); 
     vec.push_back(ptr); 
     break; 
    } 
    case STATE_MENU: 
    { 
     vec.pop_back(); 
     state ptr(new CMainMState); 
     vec.push_back(ptr); 
     break; 
    } 
    } 
} 

У меня есть эта функция, которая позволяет мне изменить текущее состояние; однако я подумал об этом, и к тому времени, когда я закончу, это станет огромным заявлением о переключении. В настоящее время в нем уже имеется около 10 состояний, это всего лишь пример кода. Я пытаюсь сделать что-то немного другое, но я не уверен, как это сделать.Создание нового объекта с параметром

void ChangeState(something) 
{ 
    vec.pop_back(); 
    state ptr(new something); 
    vec.push_back(ptr) 
} 

Если бы я мог привести его таким образом, я мог бы полностью избежать использования оператора switch и получить тот же конечный результат. Кто-нибудь знает, как это сделать? Любая помощь будет принята с благодарностью.

+1

Похоже, вы хотите шаблонов , – GManNickG

+0

Что отличает каждое состояние? Возможно, вам просто нужен класс 'State' с членами данных, которые описывают эти различия, а не отдельный класс для каждого состояния. –

+1

Что-то известно о чем-то. Если вы даете каждому государству «что-то» своего собственного типа. вы могли бы знать тип во время компиляции. Или это можно узнать только во время выполнения? – AxelOmega

ответ

1

Вам необходимо связать полиморфизм времени компиляции (т. Е. Шаблоны) и полиморфизм во время выполнения, как предлагает ryanbwork. Задача здесь состоит в том, чтобы попытаться избежать преобразования вашей текущей формы повторяющегося кода (большой switch) в аналогичную многословную, но более декларативную форму повторяющегося кода.

Как и в случае с another популярным вопросом о переполнении стека, методы клонирования обычно являются способом создания новых экземпляров динамически определяемых типов во время выполнения. Клонирование действительно конкретизация более общая модель фабрики, и вы можете создать множество заводов для типов, определение которых будет лишь чуть более многословны, чем ваша текущая перечисление предположительно является:

template <class T> 
class factory { 
public: 
    T* operator()() {return new T;} 
}; 

factory<CIntroState> IntroState; 
factory<CMainState> MainState; 
// etc... 

template <class Fac> 
void ChangeState(Fac newStateFactory) 
{ 
    vec.pop_back(); 
    vec.push_back(newStateFactory()); 
} 
+0

все, спасибо. Я думаю, что это в значительной степени затронуло мой вопрос! Спасибо за ссылку btw! – Chivos

+0

С уважением, @ user1956980. Однако я замечаю из ваших других вопросов, что вы, кажется, не привыкли принимать ответы. Возможно, это особенность StackOverflow, с которой вы не знакомы. В любом случае, это CUSTOM MADE для этой ситуации. См. Инструкции здесь: http://stackoverflow.com/about – Jollymorphic

+0

Вы правы. Это особенность, с которой я не знаком! Я принял ваш ответ! еще раз спасибо. – Chivos

1

Похоже, вам нужна комбинация templates и polymorphism. С шаблонами вам не нужно перечислять все разные типы, которые вы можете передать в функцию, так как это будет сделано для вас во время компиляции. Чтобы хранить все эти разные типы в одном и том же векторе, вам нужно, чтобы у всех подклассов был супер-тип, который затем позволяет хранить их рядом друг с другом в векторе супертипа.

+0

У меня все они взяты из абстрактного класса, поэтому все они имеют один и тот же тип. Я пытался сделать это с помощью шаблонов, но с небольшим успехом ...;) – Chivos

+0

Можете ли вы опубликовать код, который вы написали, который использовал функцию шаблона + ошибки, которые вы получали? – ryanbwork

+0

Думаю, я избавился от этого из-за того, что я был разочарован в то время. Мне придется переписать его и попытаться снова с ним связать. По какой-то причине шаблоны - это то, что я понимаю концепцией, стоящей за ними, но пока не понял ее. – Chivos

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