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

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

Отсутствие подчеркивания происходит из-за этого стиля в \App_Themes\Default\00_Controls.css:

a.Disabled {
  text-decoration: none;
}

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

a.Disabled {
  /*text-decoration: none;*/
}

При использовании стиля по умолчанию отключенный элемент управления редактора ссылок не имеет оформления текста: enter image description here

При комментировании стиля отключенный элемент управления редактора ссылок имеет оформление текста по умолчанию: enter image description here

8
задан gunr2171 1 March 2015 в 19:11
поделиться

12 ответов

"Никогда не говорите никогда". Я уверен где-нибудь во вселенной, существует ситуация, которая вынудит Вас должными быть сделать это...

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

В ответ на комментарий/вопрос - Определяют "полномочия" - установленное разрешение? Это походит не на проблему программирования, но что-то, чтобы говорить, кто бы ни утверждает было, сказано в разрешении. Возможно, это - больше политического вопроса, чем технический? Снова, я думаю, что нам нужно больше специфических особенностей - даже если это было несколько о политике ситуации. Это может или не может считаться из объема для веб-сайта, как бы то ни было.

5
ответ дан 5 December 2019 в 04:28
поделиться

Давайте не рассматривать этику на мгновение. Давайте рассмотрим стандарт.

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

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

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

Herb Sutter записал Гуру столбца Week по этой проблеме.

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

26
ответ дан 5 December 2019 в 04:28
поделиться

Я не уверен, что "этика" действительно входит в него. Это арестовывает heck из инкапсуляции все же.

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

25
ответ дан 5 December 2019 в 04:28
поделиться

Нет. То, что Вы делаете, является Чистым Злом.

7
ответ дан 5 December 2019 в 04:28
поделиться

Если Вы чувствуете желание сделать это, забыть бросать - просто изменяют объявление класса в заголовочном файле:

class A {
  private:
    int x;
};

изменение, что к:

class A {
  public:
    int x;
};

и Вы хороши для движения. Ну, возможно, "хороший" не совсем правильное слово.

4
ответ дан 5 December 2019 в 04:28
поделиться

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

3
ответ дан 5 December 2019 в 04:28
поделиться

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

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

В исходном файле, от которого необходимо получить доступ к частному элементу данных, можно вставить это как первую строку:

#define private public
#define protected public

и доступ что-либо Вы хотите.

7
ответ дан 5 December 2019 в 04:28
поделиться

А-ч, абстракция - Вы не можете жить без него, и все же это настолько болезненно для контакта с иногда :)

Так или иначе, этика в стороне, что, если "владелец" класса решает изменить внутреннюю реализацию или просто инвертирует порядок частных элементов данных?

2
ответ дан 5 December 2019 в 04:28
поделиться

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

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

1
ответ дан 5 December 2019 в 04:28
поделиться

Простой ответ: Нет.

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

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

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

0
ответ дан 5 December 2019 в 04:28
поделиться

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

struct A {
private:
  int member;
};

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

struct Amem { typedef int type; };
template class rob<Amem, &A::member>;

int main() {
  A a;
  a.*result<Amem>::ptr = 42; // Doh!
}

. ​​Но на самом деле это не показывает, что правила доступа C ++ ненадежны. Правила языка разработаны для защиты от случайных ошибок - если вы попытаетесь украсть данные объекта, язык по умолчанию не займет много времени, чтобы помешать вам.


Вышеупомянутый способ доступа к частным и защищенным членам соответствующим способом. Это еще один способ доступа к защищенным элементам в соответствии со стандартом. Основная идея состоит в том, чтобы использовать указатель на член

std::deque<int> &getAdapted(std::stack<int> &s) {
    struct voyeur : stack<int> 
    { using stack<int>::c; };
    return s.*(&voyeur::c);
}

int main() {
    std::stack<int> s;
    std::deque<int> &adapted = getAdapted(s);
    output(adapted); // print the stack...
}

Без приведения типов или каламбура. Он принимает указатель на защищенный член std :: stack через производный от него класс, в котором имя этого члена является общедоступным, поэтому компилятор позволяет это. Затем он использует его для объекта std :: stack , что тоже разрешено.

16
ответ дан 5 December 2019 в 04:28
поделиться

Я предполагаю, что этот класс является частью проекта, над которым вы работаете.

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

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

-1
ответ дан 5 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

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