Хорошо. Просто для уточнения это строго не имеет никакого отношения к объявлению. Это имеет отношение только к "перепрыгиванию через инициализацию" (C++ ISO '03 6.7/3)
, Много сообщений здесь упомянуло, что перепрыгивание через объявление может привести к переменной "не быть объявленным". Это не верно. Объект POD может быть объявлен без инициализатора, но он будет иметь неопределенное значение. Например:
switch (i)
{
case 0:
int j; // 'j' has indeterminate value
j = 0; // 'j' initialized to 0, but this statement
// is jumped when 'i == 1'
break;
case 1:
++j; // 'j' is in scope here - but it has an indeterminate value
break;
}
то, Где объект является не-POD или агрегировал компилятор неявно, добавляет инициализатор, и таким образом, не возможно перепрыгнуть через такое объявление:
class A {
public:
A ();
};
switch (i) // Error - jumping over initialization of 'A'
{
case 0:
A j; // Compiler implicitly calls default constructor
break;
case 1:
break;
}
Это ограничение не ограничено оператором переключения. Это - также ошибка использовать 'goto' для перепрыгивания через инициализацию:
goto LABEL; // Error jumping over initialization
int j = 0;
LABEL:
;
Немного мелочи - то, что вот в чем разница между C++ и C. В C это не ошибка перепрыгнуть через инициализацию.
, Поскольку другие упомянули, решение состоит в том, чтобы добавить вложенный блок так, чтобы время жизни переменной было ограничено маркировкой отдельного случая.
Вот кое-что, что поможет вам начать. Вы можете подумать, хотите ли вы, чтобы он был включающим или исключающим в конце и т. Д.
import org.joda.time.*;
import java.util.*;
class LocalDateRange implements Iterable<LocalDate>
{
private final LocalDate start;
private final LocalDate end;
public LocalDateRange(LocalDate start,
LocalDate end)
{
this.start = start;
this.end = end;
}
public Iterator<LocalDate> iterator()
{
return new LocalDateRangeIterator(start, end);
}
private static class LocalDateRangeIterator implements Iterator<LocalDate>
{
private LocalDate current;
private final LocalDate end;
private LocalDateRangeIterator(LocalDate start,
LocalDate end)
{
this.current = start;
this.end = end;
}
public boolean hasNext()
{
return current != null;
}
public LocalDate next()
{
if (current == null)
{
throw new NoSuchElementException();
}
LocalDate ret = current;
current = current.plusDays(1);
if (current.compareTo(end) > 0)
{
current = null;
}
return ret;
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
}
class Test
{
public static void main(String args[])
{
LocalDate start = new LocalDate(2009, 7, 20);
LocalDate end = new LocalDate(2009, 8, 3);
for (LocalDate date : new LocalDateRange(start, end))
{
System.out.println(date);
}
}
}
Я давно не писал итератор на Java, поэтому я надеюсь , что это правильно. Думаю, все в порядке ...
О, для блоков итераторов C #, это все, что я могу сказать ...