Это в порядке для возврата ссылки константы на члена парламента, не занимающего официального поста?

Вам на самом деле не нужно регулярное выражение, чтобы решить это. Используйте старые добрые string.Split() и имена процессов

var input = "Jeff, john45, ab, cd, peter-ivanov, @smith, sh, too_long_username, !lleg@l ch@rs, jeffbutt";
var listOfNames = input.Split(new[] {",", " "}, StringSplitOptions.RemoveEmptyEntries)
    .Where(l => l.Length >= 3 && l.Length <= 18) // filter by length
    .Where(l => l.All(c => char.IsDigit(c) || char.IsLetter(c) || c == '-')) // filter by spec chars
    .ToList();

, теперь у вас есть список из четырех имен. Если вы хотите превратить его обратно в строку, просто объедините ваши имена:

var singleLine = string.Join(", ", listOfNames);
// singleLine is "Jeff, john45, peter-ivanov, jeffbutt"
24
задан jackhab 31 March 2009 в 13:46
поделиться

8 ответов

Возврат константы и является разумной вещью сделать при многих обстоятельствах, особенно если возвращаемый объект является большим или не может быть скопирован.

Относительно const_cast помните, что "частный" спецификатор доступа в C++ там как помощь программисту - это не предназначается, чтобы быть мерами безопасности. Если кто-то хочет получить доступ к членам парламента, не занимающим официального поста объекта, это может получить их, независимо от того, что Вы пытаетесь сделать для предотвращения его.

22
ответ дан 28 November 2019 в 22:18
поделиться

Действительно ли безопасно возвратить ссылку константы на члена парламента, не занимающего официального поста

Да целый время жизни ссылки не превышает время жизни объекта, который возвратил ее. Если необходимо подвергнуть члена парламента, не занимающего официального поста, Вы не хотите измененный, это - хороший способ сделать так. Это не является надежным, но это - один из лучших способов сделать так в C++

Действительно ли возможно использовать const_cast для фактического бездельничания с участником

Да и нет ничего, что можно сделать для предотвращения этого. Нет никакого способа препятствовать тому, чтобы кто-то выбросил константу в C++ в любое время. Это - ограничение / функция C++.

В целом, хотя, необходимо отметить каждое использование const_cast как ошибка, если это не содержит достаточно подробный комментарий относительно того, почему это необходимо.

29
ответ дан 28 November 2019 в 22:18
поделиться
const int &ref = your_object.your_function();
*(int*)&ref = 1234;
11
ответ дан 28 November 2019 в 22:18
поделиться

Не волнуйтесь о пользователях, делающих const_casts только для повреждения инвариантов. Если они действительно хотят взломать Ваш код, они могут без Вас предоставляющий средства доступа Вашим внутренним атрибутам. Путем возврата постоянной ссылки обычный пользователь по ошибке не изменит данные.

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

// a.h
class A
{
public:
   A( int a ) : data_( a ) {}
   int get() const { return data_; }
private:
   int data_;
};

// malicious.h
class A;
void change( A& a, int new_value );

// malicious.cpp
//     does not include a.h, but redefines an almost exact copy of it
class A {
public:
   A( int a ) : data_( a ) {}
   int get() const { return data_; }
   int data_; // private removed
};
void change( A& a, int new_value )
{
   a.data_ = new_value;
}

// main.cpp
#include "a.h"
#include "malicious.h"
int main()
{
   A a(0);
   change( a, 10 );
   std::cout << a.get() << std::endl; // 10
}

В то время как код выше является неправильным (Одно правило определения нарушено, существует два определения для класса A), факт - то, что с большинством компиляторов определение A и malitious A двоичное совместимый. Код скомпилирует и свяжется, и результат состоит в том, что внешний код имеет доступ к Вашим частным атрибутам.

Теперь, когда Вы знаете о нем, не делайте этого. Это позже будет боль обслуживания в ***. Это стоило Microsoft довольно мало деньги в обеспечении назад совместимости к программному обеспечению, которое использовало половые органы возвращенных объектов API (новые версии API, который совместно использовал тот же открытый интерфейс, но изменился, внутренности взломают некоторый код приложения сторонних производителей). С некоторым широко доступным программным обеспечением поставщик (Microsoft в этом случае) пройдет боль обеспечения назад совместимости, но с менее известными приложениями они не будут, и внезапно Ваше ранее запущенное приложение перестанет работать во всем виде путей.

8
ответ дан 28 November 2019 в 22:18
поделиться

const_cast может определенно использоваться для получения полного доступа к участнику. Я предполагаю, что Вы не можете остановить людей, если они одержимы стрельбой themself на ноге. Если член парламента, не занимающий официального поста не тяжел, рассмотрите возврат копии той переменной.

5
ответ дан 28 November 2019 в 22:18
поделиться

Я думаю, что это был Herb Sutter, который когда-то сказал, что нужно "Защитить от Murphy, не от Machiavelli". Таким образом, необходимо сделать все возможное для защиты от кода, используемого неправильно случайно, но нет ничего, что можно сделать о людях, злоупотребляющих кодом нарочно.

Если кто-то действительно хочет взломать Ваш код, они могут, даже если это #define private public прежде включая Ваш заголовок (и таким образом создание нарушения ODR, но я отступаю).

Таким образом да, пасование назад константы касательно прекрасно.

6
ответ дан 28 November 2019 в 22:18
поделиться

Да, таким образом, это, вероятно, не, что Вы хотите сделать. С другой стороны, если кто-то идет в проблему константы, бросая Вашу ссылку, возможно, что они действительно знают то, что они делают.

1
ответ дан 28 November 2019 в 22:18
поделиться

Возможно получить полный доступ. Но что для?

Не забывайте делать средство доступа, чтобы быть корректной константой

const MyType& getMyValue() const;

Также можно ввести Вас частное значение в обратном вызове.

void doJob( callback c )
{
    c( myPrivateValue_ );
}
1
ответ дан 28 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

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