Ваш вопрос довольно неясен. Является ли mChats
Список, содержащий HomeScreenChatsHelper
объектов? Я так полагаю. Если это так, то вы можете изменить цикл foreach
на обычный цикл
//Assuming mChats is List e.g ArrayList
for (int i = 0; mChats.size(); i++){
if (mChats.get(i).getID().equals(ID)) {
mChats.remove(i);
break;
}
}
Вы можете сделать что-то очень близкое с помощью небольшого вспомогательного класса C ++.
class StartStopper {
public:
StartStopper() { start(); }
~StartStopper() { stop(); }
};
Затем в своем коде:
{
StartStopper ss;
// code here
}
Когда выполнение входит в блок и создает переменную ss
, вызывается функция start ()
. Когда выполнение покидает блок, деструктор StartStopper
будет автоматически вызван и затем вызовет stop ()
.
Другие ответы хорошо затронули вопрос RAII, поэтому Я собираюсь рассмотреть его синтаксическую сторону .
#define startstop for(Starter s; s.loop; s.loop = false)
struct Starter {
bool loop;
Starter() { start(); loop = true; }
~Starter() { stop(); }
};
Используется как :
Идиоматический способ сделать это в C ++ называется Resource Acquisition Is Initialization , или коротко RAII. Помимо предоставления того, что вы хотите, он также имеет дополнительное преимущество, заключающееся в том, что он безопасен для исключений: будет вызываться функция stop
, даже если ваш код вызывает исключение.
Определите структуру защиты:
struct startstop_guard
{
startstop_guard()
{
start();
}
~startstop_guard()
{
stop();
}
};
а затем переписать свой код так:
{
startstop_guard g;
// your code
}
Страж
#define startstop(x, y, ...) for( /* use macro args */ )
Общее решение с RAII и boost :: function (std :: function).
class starter
{
typedef boost::function< void () > action;
action end_;
public:
starter(action start, action end):
end_(end)
{
log("starter start");
start();
}
~starter()
{
log("starter end");
end_() ;
}
};
int main()
{
{
starter s(start, stop);
middle();
}
return 0;
}
или для проверки и проверки идея
void print(const std::string& message)
{
std::cout << message << std::endl;
}
int main()
{
starter s(boost::bind(print, "globalstart"),
boost::bind(print, "globalend"));
{
starter s(boost::bind(print, "start"),
boost::bind(print, "end"));
std::cout << "middle" << std::endl;
}
return 0;
}
Что вы пытаетесь сделать? Я бы порекомендовал проверить RAII как гораздо более ориентированный на C ++ способ ведения дел, чем макро-хакерство со всеми непредвиденными последствиями.
Не используйте макросы. Вместо этого вы можете использовать встроенные функции, поскольку они обеспечивают проверку типов и другие функции. Вы можете посмотреть здесь: встроенные функции
В c # вы можете использовать шаблон IDisposable и реализовать свою функцию Stop () в методе Dispose (), но это сработало бы, если бы вы использовали вариант .net c ++.
кредит dirkgently за идею... Я решил заполнить остальное
#define startstop() for(start();isStarted();stop())