Когда должен Вы возвращать ссылку на объект от метода класса

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

  • Использование CSS_SELECTOR:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix"))).click()
    
  • Использование XPATH:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='ui-dialog-buttonpane ui-widget-content ui-helper-clearfix']"))).click()
    
    [1110 ]
  • Примечание : необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Подробное обсуждение можно найти в [115 ] selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не взаимодействует с помощью Selenium

blockquote>

11
задан kal 30 January 2009 в 07:09
поделиться

7 ответов

Перегрузка операторов присваивания (как =, + =, - = и т.д.) является хорошим примером, где возврат ссылкой имеет большой смысл. Этот вид методов, очевидно, возвратил бы большие объекты, и Вы не хотите получать обратные указатели, так возврат ссылки является лучшим способом пойти. Работы как указатель и похожи на возврат значением.

4
ответ дан 3 December 2019 в 08:57
поделиться

Ссылка является скрытым указателем (таким образом, это - 4 байта на машинах на 32 бита и 8 байтов на машинах на 64 бита). Таким образом, эмпирическое правило: если копирование объекта является более дорогим, чем возврат указателя, используйте указатель (или ссылка, так как это - то же самое).

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

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

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

2
ответ дан 3 December 2019 в 08:57
поделиться

Книга Scott Meyers, Эффективный C++, имеет несколько объектов, связанных с этой темой. Я определенно проверил бы названный объект, "Не пытаются возвратить ссылку, когда необходимо возвратить объект". Это - объект № 23 в 1-х или 2-х выпусках или № 21 в 3-м выпуске.

1
ответ дан 3 December 2019 в 08:57
поделиться

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

Когда необходимо возвратить ссылку на членские данные, и когда сами данные?

По умолчанию необходимо возвращать сами данные (иначе "значением"). Это избегает нескольких проблем с возвратом ссылки:

  • Пользователи, хранящие ссылку и становящиеся иждивенцем на времени жизни Ваших участников, не рассматривая, сколько времени содержание объекта (Ваш объект) будет жить. Приводит к висячим указателям.

  • Пользовательский код, становящийся иждивенцем на точном типе возврата. Например, Вы используете a vector<T> для реализации (и это - то, что Ваш метод считывания возвращает). Пользовательский код как"vector<T> foo = obj.getItems()"появляется. Затем Вы изменяете свою реализацию (и метод считывания) для использования a deque<T> - пользовательские повреждения кода. Если Вы возвращались значением, Вы могли бы просто заставить метод считывания создать локальный вектор, скопировать данные из членской двухсторонней очереди и возвратить результат. Довольно разумный для наборов маленького размера. [*]

Таким образом, когда необходимо возвратить ссылку вместо этого?

  • Можно рассмотреть это, когда возвращенный объект огромен (Image) или non-copyable (boost::signal). Но, как всегда, можно вместо этого выбрать больше шаблона ООП наличия класса, действительно наполняют, а не имеют материал, зависающий от него. В Image случай, можно обеспечить a drawCircle функция членства, вместо возврата Image& и наличие Ваших пользователей рисует круг на нем.
  • Когда Ваши данные логически принадлежат Вашему пользователю, и Вы просто держите их для него. Рассмотрите наборы станд.: vector<T>::operator[] возвращает ссылку на T, потому что это - то, что я хочу достигнуть: мой точный объект, не копия его.

[*] существует лучший способ гарантировать соответствующий требованиям завтрашнего дня код. Вместо того, чтобы возвратить вектор (касательно значением) возвращают пару итераторов к Вашему вектору - начало и конечное. Это позволяет Вашим пользователям сделать все, что они обычно делают с двухсторонней очередью или вектором, но независимый от фактической реализации. Повышение обеспечивает boost::iterator_pair с этой целью. Как привилегия, это также имеет оператор [] перегруженный, таким образом, можно даже сделать"int i = obj.getItems()[5]"вместо"int i = obj.getItems().begin()[5]".

Это решение generalizable к любой ситуации, которая позволяет Вам рассматривать типы в общем. Например, если Вы сохраняете a Dog участник, но Ваши пользователи только должен знать, что это Animal (потому что они только звонят eat() и sleep()), возвратите ссылку/указатель Животных на freestore-выделенную копию Вашей собаки. Затем, когда Вы решаете, что собаки являются слабаками, и Вам действительно нужен волк для реализации, пользовательский код не повредится.

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

6
ответ дан 3 December 2019 в 08:57
поделиться

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

Возвратите объекты класса (даже станд.:: строка) ссылкой.

-1
ответ дан 3 December 2019 в 08:57
поделиться

Я рекомендовал бы избегать возврата ссылок по той же причине, как Iraimbilanja указывает, но по-моему можно получить очень хорошие результаты при помощи общих указателей (например, повышение, tr1) на членских данных и использовать их в ответ. Тем путем Вы не должны копировать объект, но можете все еще управлять пожизненными проблемами.

class Foo
{
private:
    shared_ptr<Bar> _bar;
public:
    shared_ptr<Bar> getBar() {return _bar;}
};

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

1
ответ дан 3 December 2019 в 08:57
поделиться

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

0
ответ дан 3 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

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