Когда использовать друга класс в C++ [дубликат]

Проблема связана с этой строкой:

document.getElementById('calculeaza').click = arie1();

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

Также обратите внимание, что вы не добавляете click обработчики событий таким способом. Вместо этого используйте addEventListener(), предоставив ссылку на вашу функцию arie1(). Попробуйте это:

function switcherForma() {
  switch (parseInt(document.getElementById('select-forma').value, 10)) {
    case 1:
      document.getElementById('f1').style.color = "red";
      document.getElementById('calculeaza').addEventListener('click', arie1);
      break;
    case 2:
      break;
    case 3:
      break;
  }
}
38
задан Community 23 May 2017 в 11:58
поделиться

10 ответов

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

41
ответ дан John D. Cook 27 November 2019 в 03:19
поделиться

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

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

Редактирование для ответа на комментарий Программиста Преступника: Мы абсолютно договариваемся об этом. Еще одна опция кроме friend'ing классов после разделения их состоит в том, чтобы обнародовать средства доступа, которые иногда повреждают инкапсуляцию! Я думаю, что некоторые люди думают, что дружественные классы так или иначе повреждают инкапсуляцию, потому что они видели, что она использовала неправильно много, и многие люди, вероятно, никогда не видят код, где она использовалась правильно, потому что это - редкая вещь. Мне нравится Ваш способ заявить это, хотя - дружелюбие является хорошим компромиссом между не разрешением Вам разделить Ваш класс и создание ВСЕГО доступного для общественности.

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

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

19
ответ дан James Thompson 27 November 2019 в 03:19
поделиться

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

P.S. Действительно скучать по "другу" ключевое слово в C#...

13
ответ дан User 27 November 2019 в 03:19
поделиться

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

своего рода' как 2-дюймовые 3/4 дюйма с 12 точками - сокет диска - не ужасно распространено, но когда Вам нужен он, Вы ужасно рады, что у Вас есть он.

9
ответ дан Rob K 27 November 2019 в 03:19
поделиться

Помогает с шаблон разработки

Сувенира
4
ответ дан Nemanja Trifunovic 27 November 2019 в 03:19
поделиться

Раздел FAQ о друзьях: здесь

раздел FQA о друзьях: здесь

Две различных точки зрения о друге.

2
ответ дан Assaf Lavie 27 November 2019 в 03:19
поделиться

Я смотрю эти friend конструкция как одна из тех функций языка, который должен использоваться в редких случаях, но это не делает это бесполезным. Существует несколько шаблонов, которые уже призывают к созданию friend классы, многие из них на этом сайте в той "Связанной" панели справа. ====>

1
ответ дан Scottie T 27 November 2019 в 03:19
поделиться

Дружба используется, когда у Вас есть несколько классов и/или функций, которые сотрудничают для обеспечения той же абстракции или интерфейса. Классический пример реализует некоторый числовой класс и все не являющиеся членом функции оператора (*, - +, < < и т.д.), даны дружбу так, чтобы они могли работать над частными данными числового класса.

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

1
ответ дан Brian Neal 27 November 2019 в 03:19
поделиться

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

Что-то вроде этого:

class cMyClassTest;

class cMyClass
{
public:
.....

private:
friend cMyClassTest;
int calc();     // tricky algorithm, test carefully

};

class cMyClassTest
{
public:
int test_calc()
{
    cMyClass test;
    ....
    int result = test.calc();

    if( result == 42 )
        return 1;
    return 0;
}
};
0
ответ дан ravenspoint 27 November 2019 в 03:19
поделиться

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

0
ответ дан 27 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

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