Как использовать preg_match ID для маршрутизации URL [duplicate]

Члены класса:

Для деструктора pure 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;
};

Non- 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 данных.

23
задан PeeHaa 24 November 2013 в 03:45
поделиться

4 ответа

+ может иметь два значения, в зависимости от контекста.

Как и другие упомянутые ответы, + обычно является оператором повторения и вызывает предыдущий токен повторять один или несколько раз. a+ будет выражаться как aa* в теории формального языка , а также может быть выражена как a{1,} (соответствует минимум 1 раз и максимум бесконечного раза).


Однако + также может делать другие кванторы притяжательной , если он следует за оператором повторения (т.е. ?+, *+, ++ или {m,n}+). Притяжательный квантификатор - это расширенная функция некоторых ароматов регулярных выражений (PCRE, Java и JGsoft engine), которая говорит движку не возвращаться назад после того, как было выполнено совпадение.

Чтобы понять, как это работает, нам нужно понять две концепции двигателей регулярных выражений: жадность и backtracking . Жадность означает, что в общем случае регулярные выражения будут пытаться потреблять столько символов, сколько могут. Скажем, наш паттерн .* ( dot - специальная конструкция в регулярных выражениях, что означает любой символ 1, звезда означает совпадение ноль или более раз), а ваша цель есть aaaaaaaab. Вся строка будет потребляться, потому что вся строка является самым длинным совпадением, которое удовлетворяет шаблону.

Однако, скажем, мы меняем шаблон на .*b. Теперь, когда движок регулярного выражения пытается сопоставлять aaaaaaaab, .* снова потребляет всю строку. Однако, поскольку двигатель достигнет конца строки, а шаблон еще не выполнен (.* потребляет все, но шаблон все же должен соответствовать b впоследствии), он будет backtrack , по одному символу за раз, и попытайтесь сопоставить b. Первый откат заставит .* потреблять aaaaaaaa, а затем b может потреблять b, и шаблон преуспевает.

Потенциальные квантификаторы также жадные, но, как уже упоминалось, после их возвращения матч, двигатель больше не может вернуться назад. Поэтому, если мы изменим наш шаблон на .*+b (сопоставим любой символ ноль или более раз, собственнически, а затем b) и попытаемся сопоставить aaaaaaaab, снова .* будет потреблять всю строку, но затем поскольку он является притяжательным, информация об отбрасывании отбрасывается, а b не может быть сопоставлена, поэтому шаблон не работает.


1 В большинстве движков точка не будет соответствовать символу новой строки, если только /s (опция «singleline» или «dotall») .

49
ответ дан Daniel Vandersluis 3 September 2018 в 17:50
поделиться

1 или более предыдущего выражения.

[0-9]+

Совпадение:

1234567890

In:

У меня есть 1234567890 долларов

5
ответ дан Chris 3 September 2018 в 17:50
поделиться

Одно или несколько вхождений предшествующих символов.

Например, a+ означает букву a один или несколько раз. Таким образом, a соответствует a, aa, aaaaaa, но не является пустой строкой.

Если вы знаете, что означает звездочка (*), вы можете выразить (exp)+ как (exp)(exp)*, где (exp) - любое регулярное выражение.

3
ответ дан phimuemue 3 September 2018 в 17:50
поделиться
10
ответ дан sepp2k 3 September 2018 в 17:50
поделиться
Другие вопросы по тегам:

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