Спецификаторы доступа C ++ по классам или экземплярам [duplicate]

| также является разделителем для нескольких правил проверки.

Например, допустимо следующее:

 $rules = [ "price" => "nullable|numeric|between:0,99" ];

Чтобы использовать это регулярное выражение, вам нужно переключиться на использование array:

$rules = [
    'price' => [ 'regex:/(^$|^\d+(,\d{1,2})?$)/' ]
];

Это также указано в документации :

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

blockquote>

Кстати, исходное правило также может делать то, что вы хотите, а также может быть написано как:

$rules [
     'price' => [ 'nullable', 'numeric', 'between:0,99' ]
]

220
задан Ajay 27 May 2016 в 11:53
поделиться

15 ответов

Частные члены доступны только в пределах класса, определяющего их.

Защищенные члены доступны в классе, который определяет их и в классах, которые наследуются от этого класса.

Изменить: оба также доступны друзьям своего класса, а в случае защищенных членов - друзьями из их производных классов.

Редактировать 2: использовать то, что имеет смысл в контексте вашей проблемы. Вы должны попытаться сделать членов закрытыми, когда сможете, уменьшить связь и защитить реализацию базового класса, но если это невозможно, используйте защищенные члены. Проверьте C ++ FAQ для лучшего понимания проблемы. Этот вопрос об защищенных переменных также может помочь.

307
ответ дан jdhao 25 August 2018 в 10:51
поделиться

private является предпочтительным для данных элемента. По умолчанию членами класса C ++ являются private.

public является предпочтительным для функций-членов, хотя это вопрос мнения. По крайней мере, некоторые методы должны быть доступны. public доступен для всех. Это самый гибкий вариант и наименее безопасный. Любой может использовать их, и кто-то может их неправильно использовать.

private недоступен вообще. Никто не может использовать их вне класса, и никто не может злоупотреблять ими. Даже в производных классах.

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

MFC - это C ++-оболочка для Windows API, она предпочитает public и protected. Классы, созданные мастером Visual Studio, имеют уродливое сочетание элементов protected, public и private. Но есть некоторые логики для самих классов MFC.

Членами, такими как SetWindowText, являются public, потому что вам часто приходится обращаться к этим членам.

Члены, такие как OnLButtonDown, обрабатывать уведомления, полученные окном. Они не должны быть доступны, поэтому они protected. Вы можете получить к ним доступ в производном классе, чтобы переопределить эти функции.

Некоторые члены должны выполнять потоки и контуры сообщений, им не следует обращаться или переопределять, поэтому они объявляются как private

В структурах C ++ члены public по умолчанию. Структуры обычно используются только для данных, а не для методов, поэтому декларация public считается безопасной.

0
ответ дан Barmak Shemirani 25 August 2018 в 10:51
поделиться

Уверенный взгляд на вопрос Protected Member Variables . Рекомендуется использовать private по умолчанию (как и C ++ class ses do) для уменьшения связи. Защищенные переменные-члены чаще всего являются плохой идеей, защищенные функции-члены могут использоваться, например. шаблон шаблона.

4
ответ дан Community 25 August 2018 в 10:51
поделиться

Доступ к защищенным элементам возможен из производных классов. Частные не могут.

class Base {

private: 
  int MyPrivateInt;
protected: 
  int MyProtectedInt;
public:
  int MyPublicInt;
}

class Derived : Base
{
public:
  int foo1()  { return MyPrivateInt;} // Won't compile!
  int foo2()  { return MyProtectedInt;} // OK  
  int foo3()  { return MyPublicInt;} // OK
};

class Unrelated 
{
private:
  Base B;
public:
  int foo1()  { return B.MyPrivateInt;} // Won't compile!
  int foo2()  { return B.MyProtectedInt;} // Won't compile
  int foo3()  { return B.MyPublicInt;} // OK
};

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

49
ответ дан DanielTuzes 25 August 2018 в 10:51
поделиться

частные и защищенные модификаторы доступа являются одними и теми же, только защищенные члены базового класса могут быть доступны за пределами основного класса в дочернем (производном) классе. Это также относится к наследованию. Но с помощью частного модификатора члены базового класса могут быть доступны только в области или коде базового класса, а его функции-друзья - только '' ''

-2
ответ дан Emmanuel Muniko 25 August 2018 в 10:51
поделиться

Атрибуты и методы, отмеченные как protected, - в отличие от частных - все еще видны в подклассах.

Если вы не хотите использовать или предоставить возможность переопределить метод в возможных подклассах , Я бы сделал их private.

5
ответ дан fhe 25 August 2018 в 10:51
поделиться
1
ответ дан Gayki 25 August 2018 в 10:51
поделиться

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

Конечно, функции друзей выкидывают это из окна, но хорошо.

4
ответ дан Ignacio Vazquez-Abrams 25 August 2018 в 10:51
поделиться

private = доступно только материнскому (базовому классу) (т. е. только мой родитель может войти в спальню моего родителя)

protected = доступно по материнской линии (базовому классу) и ее дочерям (то есть только моему родитель может войти в спальню моего родителя, но дал разрешение сына / дочери войти в спальню родителей).

public = доступно материнству (базовому классу), дочери и всем остальным (т.е. только мой родитель может войти в спальня моего родителя, но это вечеринка дома - mi casa su casa)

2
ответ дан Johan K. Rhodes 25 August 2018 в 10:51
поделиться
  • Закрыто: это спецификатор доступа. По умолчанию переменные экземпляра (члена) или методы класса в c ++ / java являются закрытыми. Во время наследования код и данные всегда унаследованы, но недоступны вне класса. Мы можем объявить наших членов данных конфиденциальными, чтобы никто не мог вносить непосредственные изменения в наши переменные-члены, и мы можем предоставлять публичные получатели и сеттеры для изменения наших частных членов. И эта концепция всегда применяется в бизнес-правиле.
  • Защищено: это также спецификатор доступа. В C ++ защищенные члены доступны внутри класса и унаследованного класса, но не вне класса. В Java защищенные члены доступны внутри класса, унаследованного класса, а также для всех классов внутри одного и того же пакета.
2
ответ дан KIN 25 August 2018 в 10:51
поделиться

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

class A
{
private:
    int _privInt = 0;
    int privFunc(){return 0;}
    virtual int privVirtFunc(){return 0;}
protected:
    int _protInt = 0;
    int protFunc(){return 0;}
public:
    int _publInt = 0;
    int publFunc()
    {
         return privVirtFunc();
    }
};

class B : public A
{
private:
    virtual int privVirtFunc(){return 1;}
public:
    void func()
    {
        _privInt = 1; // wont work
        _protInt = 1; // will work
        _publInt = 1; // will work
        privFunc(); // wont work
        privVirtFunc(); // wont work
        protFunc(); // will work
        publFunc(); // will return 1 since it's overridden in this class
    }
}
8
ответ дан Mats Fredriksson 25 August 2018 в 10:51
поделиться

Доступ к защищенному нестатистическому базовому классу может быть доступен членам и друзьям любых классов, полученных из этого базового класса, с помощью одного из следующих:

  • Указатель на прямо или косвенно производный класс
  • Ссылка на прямой или косвенно производный класс
  • Объект прямого или косвенного производного класса
0
ответ дан P i 25 August 2018 в 10:51
поделиться

Публичные члены класса A доступны для всех и для всех.

Защищенные члены класса A недоступны вне кода A, но доступны из кода любого класса, производного от A.

Частные члены класса A недоступны вне кода A или из кода любого класса, производного от A.

Итак, в конечном итоге выбор между защищенным или приватным отвечает на следующие вопросы: сколько доверия вы хотите поместить в программиста производного класса?

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

112
ответ дан paercebal 25 August 2018 в 10:51
поделиться

частные члены доступны только из класса, защищенные члены доступны в классе и производных классах. Это свойство наследования в языках OO.

В C ++ вы можете иметь частное, защищенное и публичное наследование, которое будет определять, к каким производным классам можно получить доступ в иерархии наследования. C #, например, имеет только публичное наследование.

4
ответ дан PhilGriffin 25 August 2018 в 10:51
поделиться

Причина, по которой защита MFC защищена, заключается в том, что она является основой. Вероятно, вы хотите подклассифицировать классы MFC, и в этом случае необходим защищенный интерфейс для доступа к методам, которые не видны для общего использования класса.

21
ответ дан Toon Krijthe 25 August 2018 в 10:51
поделиться
Другие вопросы по тегам:

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