Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2017, 21:45   #1
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию Шаблон не хочет работать.

Я написал шаблон
Код:
template <typename T>
bool IsNotActive(T gameObject)
{
	return gameObject
}
вместо этого всего:
Код:
bool IsEnemyDestroyed(const Enemy& enemy)
{
	return !enemy.mIsActive;
}
bool IsGoldCoinDestroyed(const GoldCoin& goldCoin)
{
	return !goldCoin.mIsActive;
}


bool IsPowerUpToLevel2Destroyed(const PowerUpToLevel2& powerUpToLevel2)
{
	return !powerUpToLevel2.mIsActive;
}

bool IsPowerUpToLevel3Destroyed(const PowerUpToLevel3& powerUpToLevel3)
{
	return !powerUpToLevel3.mIsActive;
}
И так передаю шаблон
Код:
auto itEnemy = std::remove_if(mEnemies.begin(), mEnemies.end(), IsNotActive(mEnemies));
но увы не работает. как тогда правильно делать?
dimaSlon вне форума Ответить с цитированием
Старый 02.10.2017, 21:48   #2
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Тоже самое тут:
2) Вместо двох решил шаблон сделать. но ... не работает. Я что то не так с шаблоном делаю?
Код:
bool Collide(const GameUnit& gameUnit1, const GameUnit& gameUnit2)
{
	Point topLeft1 = gameUnit1.mCenter - gameUnit1.mHalfSize;
	Point bottomRight1 = gameUnit1.mCenter + gameUnit1.mHalfSize;

	Point topLeft2 = gameUnit2.mCenter - gameUnit2.mHalfSize;
	Point bottomRight2 = gameUnit2.mCenter + gameUnit2.mHalfSize;

	return (bottomRight1.mX > topLeft2.mX) && 
		(bottomRight2.mX > topLeft1.mX) &&
		(bottomRight2.mY > topLeft1.mY) &&
		(bottomRight1.mY > topLeft2.mY);
}

bool Collide(const Trigger & trigger, const GameUnit & gameUnit)
{
	Point topLeft1 = trigger.mCenter - trigger.mHalfSize;
	Point bottomRight1 = trigger.mCenter + trigger.mHalfSize;

	Point topLeft2 = gameUnit.mCenter - gameUnit.mHalfSize;
	Point bottomRight2 = gameUnit.mCenter + gameUnit.mHalfSize;

	return (bottomRight1.mX > topLeft2.mX) &&
		(bottomRight2.mX > topLeft1.mX) &&
		(bottomRight2.mY > topLeft1.mY) &&
		(bottomRight1.mY > topLeft2.mY);
}

template <typename T1, typename T2>
bool Collide(const T1& gameObject1, const T2& gameObject2)
{
	Point topLeft1 = gameObject1.mCenter - gameObject1.mHalfSize;
	Point bottomRight1 = gameObject1.mCenter + gameObject1.mHalfSize;

	Point topLeft2 = gameObject2.mCenter - gameObject2.mHalfSize;
	Point bottomRight2 = gameObject2.mCenter + gameObject2.mHalfSize;

	return (bottomRight1.mX > topLeft2.mX) && 
		(bottomRight2.mX > topLeft1.mX) &&
		(bottomRight2.mY > topLeft1.mY) &&
		(bottomRight1.mY > topLeft2.mY);
}
dimaSlon вне форума Ответить с цитированием
Старый 02.10.2017, 21:52   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так а где ".mIsActive;" там?

И код странный какой-то. Может например лучше всем объектам наследоваться от GameObject?

Ну а в remove просто что-то странное написано в конце, шаблон не причем. Смотрите пример в документации.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 02.10.2017, 23:18   #4
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так а где ".mIsActive;" там?

И код странный какой-то. Может например лучше всем объектам наследоваться от GameObject?

Ну а в remove просто что-то странное написано в конце, шаблон не причем. Смотрите пример в документации.
Пример наведу для огня. У меня все они наследуются от
Код:
class FireBall : public GameUnit
Код:
struct GameWorld;

class FireBall : public GameUnit
{
public:
	FireBall(State state, const Point& center, const Vector& velocity, const Size& size);
	void Update(float elapsedTime, GameWorld& gameWorld);
	
	bool mIsActive;

private:
	void TestCollisionVersusEnemy(GameWorld& gameWorld);

	bool mCollidedWithGround;
};
или от тригера
Код:
#pragma once

#include "Vector.h"

struct Trigger
{
public:
	Trigger(bool isActive, const Point& center, const Size& size);

	bool mIsActive;
	Point mCenter;
	Size mHalfSize;
};
и у них и есть эта переменая mIsActive
GameObject у меня нету. В ремув ж я должен передавать функцию шаблон
если я так передаю auto itFireBall = std::remove_if(mFireBalls.begin(), mFireBalls.end(), IsFireBallDestroyed); то все ок работает
dimaSlon вне форума Ответить с цитированием
Старый 02.10.2017, 23:50   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не видите разницу между IsFireBallDestroyed и IsNotActive(mEnemies)?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.10.2017, 01:08   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Код:
template <typename T>
bool IsNotActive(const T& gameObject)
{
	return !gameObject.mIsActive;
}
т.о. можно не наследоватся, в этот шаблон подойдет любая фигня с членом-переменной mIsActive

Но я бы там еще во всех классах ее заменил на геттер типа

inline bool isActive(){return mIsActive;}

Компилятор сделает все быстро, но у нас тут свободы больше в будущем.

Да, еще я ссылку в параметре сделал, иначе вы копии плодите.

Плюс наследования с общим предком на всех в том, что все объекты (или указатели на них) можно свалить в 1 общий массив "предков". А дальше простым циклом пробегать по нему и выдавать команду типа "нарисуйся".
В вашем варианте вы логику объекта выносите за пределы объекта. Т.е. это уже у вас процедурное построение, а не ООП. В ООП вернее было бы сделать метод у предка:

Код:
bool Collide(const Parent& gameObject2) const
{
	Point topLeft1 = this->mCenter - this->mHalfSize;
	Point bottomRight1 = this->mCenter + this->mHalfSize;

	Point topLeft2 = gameObject2.mCenter - gameObject2.mHalfSize;
	Point bottomRight2 = gameObject2.mCenter + gameObject2.mHalfSize;

	return (bottomRight1.mX > topLeft2.mX) && 
		(bottomRight2.mX > topLeft1.mX) &&
		(bottomRight2.mY > topLeft1.mY) &&
		(bottomRight1.mY > topLeft2.mY);
}

Последний раз редактировалось alexzk; 03.10.2017 в 01:18.
alexzk вне форума Ответить с цитированием
Старый 03.10.2017, 14:06   #7
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Не видите разницу между IsFireBallDestroyed и IsNotActive(mEnemies)?
IsFireBallDestroyed я без аргумента передаю. а там с аргументом.
Так как правильно делать?
dimaSlon вне форума Ответить с цитированием
Старый 03.10.2017, 14:10   #8
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Код:
template <typename T>
bool IsNotActive(const T& gameObject)
{
	return !gameObject.mIsActive;
}
т.о. можно не наследоватся, в этот шаблон подойдет любая фигня с членом-переменной mIsActive

Но я бы там еще во всех классах ее заменил на геттер типа

inline bool isActive(){return mIsActive;}

Компилятор сделает все быстро, но у нас тут свободы больше в будущем.

Да, еще я ссылку в параметре сделал, иначе вы копии плодите.

Плюс наследования с общим предком на всех в том, что все объекты (или указатели на них) можно свалить в 1 общий массив "предков". А дальше простым циклом пробегать по нему и выдавать команду типа "нарисуйся".
В вашем варианте вы логику объекта выносите за пределы объекта. Т.е. это уже у вас процедурное построение, а не ООП. В ООП вернее было бы сделать метод у предка:

Код:
bool Collide(const Parent& gameObject2) const
{
	Point topLeft1 = this->mCenter - this->mHalfSize;
	Point bottomRight1 = this->mCenter + this->mHalfSize;

	Point topLeft2 = gameObject2.mCenter - gameObject2.mHalfSize;
	Point bottomRight2 = gameObject2.mCenter + gameObject2.mHalfSize;

	return (bottomRight1.mX > topLeft2.mX) && 
		(bottomRight2.mX > topLeft1.mX) &&
		(bottomRight2.mY > topLeft1.mY) &&
		(bottomRight1.mY > topLeft2.mY);
}
Код:
template <typename T>
bool IsNotActive(const T& gameObject)
{
	return !gameObject.mIsActive;
}
Код:
auto itEnemy = std::remove_if(mEnemies.begin(), mEnemies.end(), IsNotActive(mEnemies));
Severity Code Description Project File Line Suppression State
Error C2039 'mIsActive': is not a member of 'std::vector<Enemy,std::allocator<_ Ty>>'
dimaSlon вне форума Ответить с цитированием
Старый 03.10.2017, 14:33   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Да не суйте вы шаблону вектор. Там указывается предикат, а параметр сам подставится.
p51x вне форума Ответить с цитированием
Старый 03.10.2017, 14:36   #10
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Да не суйте вы шаблону вектор. Там указывается предикат, а параметр сам подставится.
я не совсем понял. я же не сую. можете выделеть что не нужно и как нужно написать,буду благодарен
dimaSlon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа не хочет работать. Renc Visual C++ 1 19.02.2013 12:19
Программа не хочет работать OperaNeMini Софт 15 02.12.2012 16:24
Сортировка не хочет работать :( Авторитет Общие вопросы C/C++ 1 05.05.2011 21:10
Не хочет работать iif alco84 Microsoft Office Access 6 18.03.2010 09:48
Не хочет работать OpenPictureDialog guffer Общие вопросы Delphi 4 08.07.2009 20:14