Как я могу связать Перечисление с его противоположным значением, как в кардинальных направлениях (Север - Юге, Востоке - Запад, и т.д.)?

PHP также имеет money_format () .

Вот пример:

echo money_format('$%i', 3.4); // echos '$3.40'

Эта функция на самом деле имеет тонны опций, перейдите к документации, с которой я связался видеть их.

Примечание: money_format не определен в Windows.

5
задан Scorcher84 15 October 2009 в 21:19
поделиться

3 ответа

Simplest, I think, is just to add a method to it. Note that this only works well if the number of enum constants won't change over time.

enum Dir {
    NORTH,
    SOUTH,
    EAST,
    WEST;

    public Dir opposite() {
        switch(this) {
            case NORTH: return Dir.SOUTH;
            case SOUTH: return Dir.NORTH;
            case EAST: return Dir.WEST;
            case WEST: return Dir.EAST;
            default: throw new IllegalStateException("This should never happen: " + this + " has no opposite.");
        }
    }
}

Then, in your code, you could do this:

randomNeighbor.walls.put(randDir.opposite(), false);
10
ответ дан 18 December 2019 в 06:12
поделиться

еще один способ без переключателя / футляра или необходимости сохранять состояние:

public enum Dir {
   NORTH { @Override public Dir opposite() { return SOUTH; }},
   EAST  { @Override public Dir opposite() { return WEST;  }},
   SOUTH { @Override public Dir opposite() { return NORTH; }},
   WEST  { @Override public Dir opposite() { return EAST;  }},
   ;

   abstract public Dir opposite();
}
15
ответ дан 18 December 2019 в 06:12
поделиться

Если вы этого не сделаете. Определите эти четыре метода (шесть в C ++ 11), компилятор сгенерирует их для вас:

  • Конструктор по умолчанию
  • Конструктор копирования
  • Оператор присваивания
  • Деструктор
  • Конструктор перемещения (C ++ 11)
  • Назначение перемещения (C ++ 11)

Если вы хотите знать, почему?
Это необходимо для обеспечения обратной совместимости с C (поскольку структуры C можно копировать с помощью = и в объявлении). Но это также упрощает написание простых классов. Некоторые утверждают, что это добавляет проблем из-за «проблемы неглубокого копирования». Мой аргумент против этого заключается в том, что у вас не должно быть класса с собственными указателями RAW. Эта проблема решается с помощью соответствующих интеллектуальных указателей.

Конструктор по умолчанию (если другие конструкторы не определены)

Созданный компилятором конструктор по умолчанию вызовет конструктор по умолчанию базовых классов, а затем конструктор по умолчанию для каждого члена (в том порядке, в котором они объявлены)

Деструктор (Если деструктор не определен)

Вызывает деструктор каждого члена в обратном порядке объявления. Затем вызывает деструктор базового класса.

Конструктор копирования (если конструктор копирования не определен)

Вызывает конструктор копирования базового класса, передавая объект src. Затем вызывает конструктор копирования каждого члена, используя члены объектов src в качестве копируемого значения.

Оператор присваивания

Вызывает оператор присваивания базового класса, передавая объект src. Затем вызывает оператор присваивания для каждого члена, используя объект src в качестве копируемого значения.

Конструктор перемещения (если конструктор перемещения не определен)

Вызывает конструктор перемещения базового класса, передавая объект src. Затем вызывает конструктор перемещения каждого члена, используя элементы src objects в качестве перемещаемого значения.

Оператор присваивания перемещения

Вызывает оператор присваивания перемещения базового класса, передавая объект src.

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: