Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kjefes от Март 13, 2012, 21:37



Название: имя класса и шаблон
Отправлено: kjefes от Март 13, 2012, 21:37
Здравствуйте, скажите, насколько правильна следующая конструкция?
Код:
template <class T>
class T
{
 //...
};

Ибо мне как раз такое и нужно, но компилятор Qt ругается:
"ошибка: using template type parameter 'T' after 'class'", а компилятор VS не выдает никаких ошибок.




Название: Re: имя класса и шаблон
Отправлено: mutineer от Март 13, 2012, 21:43
А что ты пытаешься этим вообще сделать? имхо, оно как-то бессмысленно


Название: Re: имя класса и шаблон
Отправлено: BRE от Март 13, 2012, 21:45
но компилятор Qt ругается:
Компилятором Qt с натяжкой можно назвать moc :), но это не он, эту ошибку выдает компилятор с++.


Название: Re: имя класса и шаблон
Отправлено: kjefes от Март 13, 2012, 21:53
Есть паттерн фабричный метод =) У меня в нем названия классов передаются через параметр, т.е.
Код:
Product *Creator::Create(QString name, QString text)
{
    if(name== "name1") return new name1(text);
    if(name== "name2") return new name2(text);
    if(name== "name3") return new name3(text);
    //...
    if(name== "nameN") return new nameN(text);
    return new Unknown(text);
}

И таких классов штук 15, но общий код в них одинаковый, по сути только имя класса различно; там еще у каждого класса свой номерок есть, поэтому и надо каждый раз создавать новый класс.

Вот и хотел классы name1, name2 как-то объединить по коду


Название: Re: имя класса и шаблон
Отправлено: mutineer от Март 13, 2012, 21:59
Классы ничем не отличаются?О_о а зачем они тогда разные?


Название: Re: имя класса и шаблон
Отправлено: BRE от Март 13, 2012, 21:59
И таких классов штук 15, но общий код в них одинаковый, по сути только имя класса различно; там еще у каждого класса свой номерок есть, поэтому и надо каждый раз создавать новый класс.

Вот и хотел классы name1, name2 как-то объединить по коду
Если они внутри полностью одинаковые, тогда зачем их 15?


Название: Re: имя класса и шаблон
Отправлено: V1KT0P от Март 13, 2012, 22:03
Есть паттерн фабричный метод =) У меня в нем названия классов передаются через параметр, т.е.
Код:
Product *Creator::Create(QString name, QString text)
{
    if(name== "name1") return new name1(text);
    if(name== "name2") return new name2(text);
    if(name== "name3") return new name3(text);
    //...
    if(name== "nameN") return new nameN(text);
    return new Unknown(text);
}

И таких классов штук 15, но общий код в них одинаковый, по сути только имя класса различно; там еще у каждого класса свой номерок есть, поэтому и надо каждый раз создавать новый класс.

Вот и хотел классы name1, name2 как-то объединить по коду
По-моему ты начитался про шаблоны проектирования толком не изучив С++.


Название: Re: имя класса и шаблон
Отправлено: kjefes от Март 13, 2012, 22:10
Каждый такой класс имеет свой уникальный и неповторимый номер ) Если в примере, то можно представить так.
Есть игра, в которой куча человечков, человеки одинаковы тем, что имеют: две ноги, две руки, туловище и голову. А различаются: номером, именем и .. некоторые лысые, другие волосатые. Как то так.. Хотелось чтобы создавался класс Человек1(номер,имя,волосатость), Человек2(номер,имя,волосатость),.. Потом просто эти классы будут взаимодействовать между собой, обращаясь по номеру. И если потребуется изменять только класс Человек1, к примеру добавив еще одну руку и убрав ногу, то так будет проще сделать, просто уже создав отдельно этот класс.


Название: Re: имя класса и шаблон
Отправлено: mutineer от Март 13, 2012, 22:13
Ну так сделай номер свойством и присваивай его в фабрике


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

это ты как себе представляешь?


Название: Re: имя класса и шаблон
Отправлено: V1KT0P от Март 13, 2012, 22:18
Каждый такой класс имеет свой уникальный и неповторимый номер ) Если в примере, то можно представить так.
Есть игра, в которой куча человечков, человеки одинаковы тем, что имеют: две ноги, две руки, туловище и голову. А различаются: номером, именем и .. некоторые лысые, другие волосатые. Как то так.. Хотелось чтобы создавался класс Человек1(номер,имя,волосатость), Человек2(номер,имя,волосатость),.. Потом просто эти классы будут взаимодействовать между собой, обращаясь по номеру. И если потребуется изменять только класс Человек1, к примеру добавив еще одну руку и убрав ногу, то так будет проще сделать, просто уже создав отдельно этот класс.
Дык это решается одним классом а параметры передаешь через конструктор:
Человек лысыйтолсят(12, Вася, Лысый, Толстый, Тупой);


Название: Re: имя класса и шаблон
Отправлено: kjefes от Март 13, 2012, 22:28
Дык это решается одним классом а параметры передаешь через конструктор:
Человек лысыйтолсят(12, Вася, Лысый, Толстый, Тупой);

Ну так сделай номер свойством и присваивай его в фабрике

А если я захочу, чтобы потом некоторые Человеки имели по три руки? Для этого и надо мне, чтобы у каждого был свой класс. Это сейчас у них есть такой общий код, а потом его скорее всего и не будет.


Название: Re: имя класса и шаблон
Отправлено: kjefes от Март 13, 2012, 22:31
То есть по сути мне нужен каждый раз новый класс для каждого имени.


Название: Re: имя класса и шаблон
Отправлено: mutineer от Март 13, 2012, 22:33
Ну так сделай номер свойством и присваивай его в фабрике

А если я захочу, чтобы потом некоторые Человеки имели по три руки? Для этого и надо мне, чтобы у каждого был свой класс. Это сейчас у них есть такой общий код, а потом его скорее всего и не будет.

В этом самом "потом" шаблон тебе не особо поможет. Впрочем, делай как знаешь, но имхо что-то неправильно

Ну и ты так и не рассказал как объекты смогут взаимодействовать через номер, который есть в имени класса... А это очень интересно


Название: Re: имя класса и шаблон
Отправлено: V1KT0P от Март 13, 2012, 22:33
Дык это решается одним классом а параметры передаешь через конструктор:
Человек лысыйтолсят(12, Вася, Лысый, Толстый, Тупой);

Ну так сделай номер свойством и присваивай его в фабрике

А если я захочу, чтобы потом некоторые Человеки имели по три руки? Для этого и надо мне, чтобы у каждого был свой класс. Это сейчас у них есть такой общий код, а потом его скорее всего и не будет.
Раскрой глаза смысл С++ в том чтобы писать как можно меньше кода и иметь как можно больше общего кода.
Вот объясни мне в чем проблема на лету изменить количество рук в классе? Вот ты хочешь жестко привязать количество рук к классу а если в игре игрок потеряет руку или наоборот мутирует и у него вырастит две новые руки, что ты будешь делать?
У меня такое впечатление что ты полный ноль в программировании ибо не понимаешь самых банальных вещей.


Название: Re: имя класса и шаблон
Отправлено: kjefes от Март 14, 2012, 06:23
В этом самом "потом" шаблон тебе не особо поможет. Впрочем, делай как знаешь, но имхо что-то неправильно
Ну и ты так и не рассказал как объекты смогут взаимодействовать через номер, который есть в имени класса... А это очень интересно
Да в том и дело, что хотел сделать так, придется по другому хранить данные.
Номер не в имени, а просто у каждого класса свой порядковый номер будет, который не повторяется, да и скорость поиска нужного класса по номеру вполне меня устраивает.

Раскрой глаза смысл С++ в том чтобы писать как можно меньше кода и иметь как можно больше общего кода.
Вот объясни мне в чем проблема на лету изменить количество рук в классе? Вот ты хочешь жестко привязать количество рук к классу а если в игре игрок потеряет руку или наоборот мутирует и у него вырастит две новые руки, что ты будешь делать?
У меня такое впечатление что ты полный ноль в программировании ибо не понимаешь самых банальных вещей.
Потерять руку он просто не может =) У класса, да, жестоко вшит метод его отображения. Чтобы у него было три руки он должен быть сразу создан необходимым классом.


Название: Re: имя класса и шаблон
Отправлено: kjefes от Март 14, 2012, 06:29
Да и не надо привязываться к рукам =) Мне просто было интересно узнать то ли в Qt зря отгородили от создания подобной конструкции, то ли просто VS сразу не дает по рукам, то ли это еще какая-то прихоть какой-то версии какого-то компилятора.


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 14, 2012, 07:37
Это скорее прихоть здравого смысла... Который не даёт тебе хрень творить :D

Тебе нужен 1 класс. Просто с изменяемыми полями. Всё.
Нужен четырёхрукий монстр с жополицом -
Код:
Monst * tratata = new Monst("Тут его зовут", "Тут его прозвищу","Тут кол-во патронов"," тут кол-во ячеек инвенторя")
tratata->setРуки(4);
tratata->setЛицо("Жопа");
tratata->setЧеловечность("Не человек");


Название: Re: имя класса и шаблон
Отправлено: V1KT0P от Март 14, 2012, 08:42
Тебе нужен 1 класс. Просто с изменяемыми полями. Всё.
Скорее всего ему нужна книжка по основам программирования =), ибо он такую ересь несет...


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 14, 2012, 08:56
Ну начал человек с шаблонов, подумаешь.

Я в них только разбираться начал на второй год серьёзно, а он сразу начал.

Это его право!!!!

Он достоин (n+1) шаблонов, заменяемых впрочем на 1 класс ;)


Название: Re: имя класса и шаблон
Отправлено: mutineer от Март 14, 2012, 11:09
Да в том и дело, что хотел сделать так, придется по другому хранить данные.
Номер не в имени, а просто у каждого класса свой порядковый номер будет, который не повторяется, да и скорость поиска нужного класса по номеру вполне меня устраивает.

так номер все-таки будет полем?


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 14, 2012, 12:06
У него такая каша... Думается он и сам незнает что чем будет.

Мой совет - листок бумаги -> ручка -> примерный алгоритм работы -> понимание сложных мест -> доработка алгоритма -> и только тогда - реализация ;)


Название: Re: имя класса и шаблон
Отправлено: V1KT0P от Март 14, 2012, 12:11
У него такая каша... Думается он и сам незнает что чем будет.

Мой совет - листок бумаги -> ручка -> примерный алгоритм работы -> понимание сложных мест -> доработка алгоритма -> и только тогда - реализация ;)
Как по мне то ему надо: учебник по программированию -> простенькие програмки -> просмотр и понимание исходников простеньких игр -> попытка сделать простенькую игру -> еще раз взять учебник и прочитать непонятные моменты -> снова попробовать написать простенькую игру -> понять что архитектуру следует продумывать заранее -> переписывание игры -> еще раз посмотреть как делают простенькие игры -> повторять предыдущие три шага пока не достигнет прозрения -> начать писать игру которую хочет ну и т.д. =)


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 14, 2012, 12:13
Мой алгоритм как бы проще ;) Он уже на 3 пункте поймёт что нужно читать учебник :D


Название: Re: имя класса и шаблон
Отправлено: Igors от Март 14, 2012, 13:32
Это скорее прихоть здравого смысла... Который не даёт тебе хрень творить :D

Тебе нужен 1 класс. Просто с изменяемыми полями. Всё.
Нужен четырёхрукий монстр с жополицом -
1 класс - в духе "мастеров простых решений". Классы могут быть очень слабо связаны или вообще никак, появляется масса полей/методов которые значимы для некоторых или вообще одного класса. Если уж фабрика - ну и делайте фабрику, обзаводитесь инвентарем и.т.п

Код
C++ (Qt)
struct CInventory {
 virtual int Type( void ) const = 0;
 virtual QString Name( void ) const = 0;
 virtual CBaseClass * Create( void ) = 0;
};
 
// для каждого из 15 создаете свой инвентарь и сохраняете в мапе
RegisterInventory( new CMyClass1_Inventory );
RegisterInventory( new CMyClass2_Inventory );
...
 
// ну и крутите с мапой
 


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 14, 2012, 13:43
А в любом случае универсальных классов не будет. Никогда. Нигде.

Потому нужно разделять.
К примеру возьмём любую игру (вообще). Там тупо несколько классов - игрок (заодно и монстр), инвентарь (для всех объектов несущих что-то), бафы(общие опять таки для всех), объекты (стены и прочая хреновина), вещь(то что в инвенторе.)

При этом каждый класс может быть любым классом. Делаем игрока-стену неубиваемую. Или же стену-сундук. Или же монстра-бафера.

И уже при помощи этих классов создаётся любая пвп игра.


Название: Re: имя класса и шаблон
Отправлено: Igors от Март 14, 2012, 15:45
Инвентарь в играх - обычно нормальные объекты/модели. Инвентарь в фабрике - маленькие классы чтобы как-то "связаться" с исполняющими классами, ну хотя бы создать экземпляр. Впрочем лично я от фабрики не в восторге


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 14, 2012, 15:52
Igor's поделись разницей фабрики и динамического создания классов?

Хотя по сути это ведь одно и то же?


Название: Re: имя класса и шаблон
Отправлено: BRE от Март 14, 2012, 15:53
динамического создания классов
Такого не может быть в C++.


Название: Re: имя класса и шаблон
Отправлено: Igors от Март 14, 2012, 18:05
Igor's поделись разницей фабрики и динамического создания классов?

Хотя по сути это ведь одно и то же?
Не знаю о каком динамическом создании Вы говорите. Фабрика - по сути то что человек написал здесь
Есть паттерн фабричный метод =) У меня в нем названия классов передаются через параметр, т.е.
Код:
Product *Creator::Create(QString name, QString text)
{
    if(name== "name1") return new name1(text);
    if(name== "name2") return new name2(text);
    if(name== "name3") return new name3(text);
    //...
    if(name== "nameN") return new nameN(text);
    return new Unknown(text);
}
Но так прямолинейно не очень хорошо. Напр у меня классы name1, name2.. - загрузчики имеджей разных форматов. Появляется имедж, надо как-то подобрать ему загрузчик из имеющихся. Сначала по типу файла, потом (если не получилось) по расширению, потом попытаться открыть, потом может прочитать (весь или только инфу). На каждой из этих операций мне нужно перебирать все загрузчики, вот и фабрика чтобы автоматизировать.


Название: Re: имя класса и шаблон
Отправлено: Bepec от Март 15, 2012, 06:57
У блин :) А мне проще класс написать определения типа изображения. Но принцип понял, спасибо :)


Название: Re: имя класса и шаблон
Отправлено: m_ax от Март 17, 2012, 00:29
Есть паттерн фабричный метод =) У меня в нем названия классов передаются через параметр, т.е.
Код:
Product *Creator::Create(QString name, QString text)
{
    if(name== "name1") return new name1(text);
    if(name== "name2") return new name2(text);
    if(name== "name3") return new name3(text);
    //...
    if(name== "nameN") return new nameN(text);
    return new Unknown(text);
}

И таких классов штук 15, но общий код в них одинаковый, по сути только имя класса различно; там еще у каждого класса свой номерок есть, поэтому и надо каждый раз создавать новый класс.

Вот и хотел классы name1, name2 как-то объединить по коду

Это можно сделать через специализацию шаблонного класса. Например:
Код
C++ (Qt)
enum NameOfClasses {NoName, Name1, Name2, Name3, ... NameN};
 
template <int>
class Object {};
 
// Специализации:
 
template<>
class Object<Name1>
{
public:
   void someMethod() { // Реализация #1 }
};
 
template<>
class Object<Name2>
{
public:
   void someMethod() { // Реализация #2 }
};
 
template<>
class Object<NameN>
{
public:
   void someMethod() { // Реализация #N }
};
 
 
Product *Creator::Create(NameOfClasses name, QString text)
{
   if(name== Name1) return new Object<Name1>(text);
   if(name== Name2) return new Object<Name2>(text);
   if(name== Name3) return new Object<Name3>(text);
   //...
   if(name== NameN) return new Object<NameN>(text);
 
   return new Object<NoName>(text);
}