Решением Вашей проблемы не является создание Ваших собственных итераторов, но использование существующих контейнеров STL и итераторов. Сохраните точки в каждой форме в контейнере как вектор.
class Shape {
private:
vector <Point> points;
то, Что Вы делаете с тех пор, зависит от Вашего дизайна. Лучший подход должен выполнить итерации через точки в методах в Форме.
for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
/* ... */
, Если Вам нужно к точкам доступа вне Формы (это могло бы быть меткой несовершенного дизайна) можно создать в методах Формы, которые возвратятся, функции доступа итератора для точек (в этом случае также создают общедоступное определение типа для контейнера точек). Посмотрите на ответ Konrad Rudolph для деталей этого подхода.
Перечисление является константой, а результат .ToString () - нет. Что касается компилятора, это динамическое значение. Возможно, вам потребуется преобразовать регистр switch в серию операторов if / else
Преобразуйте строку в вашем переключателе в значение перечисления.
(ORDER)Enum.Parse(typeof(ORDER), value, true);
В качестве альтернативы использованию if .. else
вы можете сначала преобразовать вашу строку в enum
. Вероятно, это не имело бы особого смысла, если количество опций невелико:
if (Enum.IsDefined(typeof(ORDER), value))
{
switch ((ORDER)Enum.Parse(typeof(ORDER), value)
{
case ORDER.partial01:
// ...
break;
case ORDER.partial12:
// etc
}
}
else
{
// Handle values not in enum here if needed
}
* вздох * , если бы был только встроенный T Enum.Parse
, и версия TryParse :)
Вы создали это как перечисление по какой-то причине, но на самом деле вы не используете его как перечисление. Почему вы берете значение перечисления и конвертируете его в строку для последующего использования в переключателе вместо того, чтобы просто использовать перечисление?
Вы сказали, что не можете проанализировать это в перечислении, потому что некоторые из значений находятся за пределами диапазон перечисления. Тогда возникает вопрос: «Почему?» В чем смысл перечисления, если вы разрешаете значения, которые не определены? Что вы хотите, чтобы получить значение, которое не определено? Если то же самое для любого неопределенного значения, то вы можете использовать регистр по умолчанию. Если это не так, то вы можете включить дополнительные случаи, которые соответствуют числовому представлению.
Если вы действительно получаете строки обратно, то, вероятно, вы этого не сделаете. Я не хочу использовать перечисление. Вместо этого вы хотите создать общедоступный статический класс, содержащий общедоступные строковые константы, которые затем можно использовать в своем коммутаторе. Хитрость здесь в том, что оценка будет производиться с учетом регистра.
public static class Order
{
public const string Unknown = "Unknown";
public const string Partial01 = "Partial01";
public const string Partial12 = "Partial12";
public const string Partial23 = "Partial23";
}
string value = Order.Partial01
switch (value)
{
case Order.Partial01:
break;
default:
// Code you might want to run in case you are
// given a value that doesn't match.
break;
}
(Вы также можете очистить корпус.)
Это не статическое значение с точки зрения компилятора, поскольку это вызов функции:
ORDER.partial01.ToString()
Следовательно, вы не можете использовать его как сравнение в операторе case. Однако вы можете просто сделать это:
case "partial01"
Это сработает, поскольку значение перечисления и строка идентичны.
Не могли бы вы просто вместо этого сказать
case "partial01":
?
перечисления постоянны, но ToString () - это функция, возвращающая значение. на основе экземпляра объекта перечисления, для которого он вызывается.
Это два оператора:
ORDER.partial01.ToString()
ORDER.partial02.ToString()
вызывает одну и ту же функцию, но возвращает два разных значения, поэтому вызов функции .ToString () находится внутри себя, а не постоянное значение.
Значения перечисления являются константами, но вы пытаетесь использовать результаты метода (ORDER.partial01.ToString ()), а не константу.
На мой взгляд, лучшим вариантом было бы просто переключить это вокруг использования операторов if / else if / else вместо переключателя. Это позволит вам использовать желаемую логику.
В качестве альтернативы, если вы переключите вашу строку на значение перечисления, вы можете напрямую включить значения перечисления. Однако вы не можете включить enum + null + другие строки одним переключателем.