Разрешено ли использовать переменную-член передаваемого объекта класса аргумента при определении функции-члена класса? [Дубликат]

класс javafx.scene.Node имеет пару методов setUserData (Object) и Object getUserData ()

, которые вы могли бы использовать для добавления вашей информации в узел.

So , вы можете вызвать page.setUserData (info);

И контроллер может проверить, задана ли информация. Кроме того, вы можете использовать ObjectProperty для пересылки данных назад, если это необходимо.

Соблюдайте документацию здесь: http://docs.oracle.com/javafx/2/api/javafx/fxml /doc-files/introduction_to_fxml.html Перед фразой «В первой версии handleButtonAction () помечен с помощью @FXML, чтобы разрешить разметку, определенную в документе контроллера, вызвать ее. Во втором примере поле кнопки аннотируется, чтобы позволить загрузчику устанавливать его значение. Метод initialize () аналогично аннотируется. "

Итак, вам нужно связать контроллер с узлом и установить пользовательские данные для узла.

69
задан Keith 3 August 2011 в 04:00
поделиться

7 ответов

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

4
ответ дан Adam Maras 19 August 2018 в 00:04
поделиться

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

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

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

10
ответ дан André Caron 19 August 2018 в 00:04
поделиться

Так как это работает на C ++. В C ++ управление доступом работает на основе per-class , а не на основе каждого объекта.

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

Некоторые рекомендации по управлению объектами присутствуют в спецификации protected access , поэтому он даже имеет свою собственную выделенную главу в стандарт (11.5). Но все же описанные там характеристики каждого объекта довольно рудиментарны. Опять же, управление доступом на C ++ предназначено для работы на основе класса.

60
ответ дан AnT 19 August 2018 в 00:04
поделиться
  • 1
    +1. C ++ является большим по механизмам времени компиляции, не столь большим по механизмам времени выполнения. Довольно хорошее общее правило. – Nemo 3 August 2011 в 05:38
  • 2
    В вашем & quot; на самом деле невозможно реализовать какой-либо значимый контроль доступа к каждому объекту во время компиляции & quot ;. Почему нет? В void X::f(X&x) компилятор легко может различать this->a и x.a. Для компилятора не всегда (всегда) знать, что *this и x являются фактически одним и тем же объектом, если вызывается x.f(x), но я вполне мог видеть, что дизайнер языка находит это ОК. – André Caron 3 August 2011 в 13:24
  • 3
    @ AndréCaron Я думаю, что на самом деле это намного больше, чем чайник из рыбы, чем вы это делаете. Когда вложение не происходит, компилятору всегда нужно будет проверить, совпадают ли this и &x. Чтобы ухудшить это, на самом деле это проблема даже с X::f(Y& y), потому что наш конкретный объект может иметь тип Z, который наследуется как от X, так и от Y. Короче говоря, это настоящий беспорядок, а не исполнительский, трудно работать с MI. – Nir Friedman 4 April 2017 в 16:35
  • 4
    @NirFriedman Я думаю, вы неправильно поняли это предложение. При компиляции X::f(X& x), если есть доступ к x.a, он не будет компилироваться. Ничего другого не меняется, никакие проверки не нужно вставлять, поэтому производительность программ с неизменными действиями не влияет. И это не предлагается как переломное изменение существующего C ++, а как то, что дизайнеры могли сделать при введении private изначально. – Alexey Romanov 15 February 2018 в 14:46

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

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

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

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

11
ответ дан JackyZhu 19 August 2018 в 00:04
поделиться

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

1
ответ дан Jacob 19 August 2018 в 00:04
поделиться

«Частный» на самом деле не является механизмом контроля доступа в смысле «Я сделал свои фотографии на facebook частным, чтобы вы их не видели».

В C ++, «private» просто говорит, что это части класса, которые вы (кодер класса) могли бы изменить в будущих версиях и т. Д., И вы не хотите, чтобы другие кодеры, использующие ваш класс, полагались на их существование или функциональность.

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

26
ответ дан vsekhar 19 August 2018 в 00:04
поделиться

Частные данные остаются закрытыми до тех пор, пока кто-то, у кого есть доступ к нему, не обнаружит его другим.

Эта концепция применима и к другой ситуации, например:

class cMyClass
{
public:
   // ...
   // omitted for clarity
   // ...

   void Withdraw(int iAmount)
   {
      iTheSecretVault -= iAmount;
   }

private:
   int iTheSecretVault;
};

снимать деньги? :) [/ Д2]

-7
ответ дан YeenFei 19 August 2018 в 00:04
поделиться
  • 1
    В этом примере не задействован один экземпляр класса, обращающийся к частным данным других экземпляров. – André Caron 3 August 2011 в 04:23
  • 2
    @Andre, «Эта концепция применима и к другой ситуации, такой как ... & quot; – YeenFei 3 August 2011 в 04:49
  • 3
    «Другая ситуация» не по теме по определению, поэтому ваш пример не имеет никакого отношения (и я не уверен, что он будет информативным и в другом месте) – underscore_d 5 December 2015 в 19:01
  • 4
    Это не совсем правильное объяснение вопроса. – M.S.P 20 February 2016 в 18:10
Другие вопросы по тегам:

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