Простое и быстрое решение этой проблемы с использованием наследования прототипа:
Array.prototype.sortBy = function(p) {
return this.slice(0).sort(function(a,b) {
return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
});
}
Пример / Использование
objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];
objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]
objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]
Обновление: больше не изменяет исходный массив.
Насколько я знаю, Вы не можете только сделать это кратким обзором?
class parent {
public:
virtual void handle_event(int something) const = 0 {
// boring default code
}
};
я думал, что читал на www.parashift.com, что можно на самом деле реализовать абстрактный метод. Который имеет смысл мне лично, единственная вещь, которую он делает, вынудить подклассы реализовать его, никто ничего не сказал об этом не позволяемый иметь саму реализацию.
Что-то как C# override
ключевое слово не является частью C++.
В gcc, -Woverloaded-virtual
предостерегает от сокрытия виртуальной функции базового класса с функцией того же имени, но достаточно другая подпись, что это не переопределяет его. Это, тем не менее, не защитит Вас от отказа переопределить функцию из-за самой опечатки в названии функции.
В MSVC можно использовать ключевое слово CLR override
, даже если Вы не компилируете для CLR.
В g ++, нет никакого прямого способа осуществить это во всех случаях; другие люди дали хорошие ответы о том, как поймать различия в подписи с помощью -Woverloaded-virtual
. В будущей версии кто-то мог бы добавить синтаксис как __attribute__ ((override))
или эквивалентное использование C++ 0x синтаксис.
Я предложил бы небольшое изменение в Вашей логике. Это может или не может работать, в зависимости от того, что необходимо выполнить.
handle_event () может все еще сделать "скучный код по умолчанию", но вместо того, чтобы быть виртуальным, в точке, где Вы хотите, чтобы это сделало, "новый захватывающий код" имеет вызов базового класса абстрактный метод (т.е. must-be-overridden) метод, который будет предоставлен Вашим классом-потомком.
РЕДАКТИРОВАНИЕ: И если Вы позже решаете, что некоторые Ваши классы-потомки делают не потребность предоставить "новый захватывающий код", затем можно изменить краткий обзор на виртуальный и предоставить пустую реализацию базового класса той "вставленной" функциональности.
Сделайте функциональный краткий обзор, так, чтобы производные классы не имели никакого другого выбора, чем переопределить его.
@Ray Ваш код недопустим.
class parent {
public:
virtual void handle_event(int something) const = 0 {
// boring default code
}
};
Абстрактные функции не могут иметь тел, определенных встроенный. Это должно быть изменено для становления
class parent {
public:
virtual void handle_event(int something) const = 0;
};
void parent::handle_event( int something ) { /* do w/e you want here. */ }
Ваш компилятор может иметь предупреждение, что он может генерировать, если функция базового класса становится скрытой. Если это делает, включите его. Это поймает столкновения константы и различия в списках параметров. К сожалению, это не раскроет орфографическую ошибку.
, Например, это предупреждает C4263 в Microsoft Visual C++.