virtual
требуется реализация. Объявление деструктора по-прежнему требует определения его (в отличие от обычной функции):
struct X
{
virtual ~X() = 0;
};
struct Y : X
{
~Y() {}
};
int main()
{
Y y;
}
//X::~X(){} //uncomment this line for successful definition
Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.
virtual
методы должны быть реализованы или определены как чистые. Это похоже на методы не virtual
без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:
struct X
{
virtual void foo();
};
struct Y : X
{
void foo() {}
};
int main()
{
Y y; //linker error although there was no call to X::foo
}
Чтобы это сработало, объявите X::foo()
чистым:
struct X
{
virtual void foo() = 0;
};
virtual
Некоторые члены должны быть определены, даже если они явно не используются:
struct A
{
~A();
};
Следующие ошибки приведут к ошибке:
A a; //destructor undefined
Реализация может быть встроенной в самом определении класса:
struct A
{
~A() {}
};
или снаружи:
A::~A() {}
Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline
, чтобы предотвратить множественное определение.
Все используемые методы-члены должны быть определены, если они используются.
struct A
{
void foo();
};
void foo() {}
int main()
{
A a;
a.foo();
}
Определение должно быть
void A::foo() {}
static
. Члены данных должны быть определены вне класса в единственная единица перевода: struct X
{
static int x;
};
int main()
{
int x = X::x;
}
//int X::x; //uncomment this line to define X::x
Инициализатор может быть предоставлен для элемента данных static
const
типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const
данных.
Для любого, кто ищет ответ: Да, это действительно возможно, также как и упоминалось, читаемость сомнительна.
<div ng-class="(conversation.read ? 'read' : 'unread') + ' ' + (conversation.incoming ? 'in' : 'out')"></div>
Из документации ngClass:
директива работает тремя различными способами, в зависимости от того, из какого из трех типов выражение оценивается следующим образом:
blockquote>
- Если выражение оценивает строку, строка должна быть одним или> большим числом имен разделов пробела .
- Если выражение оценивает массив, каждый элемент массива> должен> быть строкой, которая представляет собой одно или несколько имен классов с разделителями по размеру.
- Если выражение оценивается как объект, тогда для каждой пары «ключ-значение»> объекта с истинным значением соответствующий ключ используется как имя класса.
Здесь применим вариант 1.
Из моего понимания, используя этот метод, вы получите 2 часа, в то время как использование нотации объектов приведет к 4, но я могу ошибаться в этом.
Я думаю, вы предпочтете использовать фильтр . Вы можете написать фильтр rateToClass
, который будет содержать логику и преобразовать вашу скорость в названии класса, которое вы хотите.
Вы также можете поместить функцию rateToClass (rate) в свою область действия, но она уродливая.
Если вы настаиваете на том, что ваша логика в представлении, ng-class
поддерживает несколько классов с помощью объекта (см. первый пример официального документа doc , строка 7):
<p ng-class="{strike: strike, bold: bold, red: red}">Map Syntax Example</p>
У вас может быть более сложное выражение, например ng-class='{btn-success: rate > 0}
'.