Да, сценарии могут получить доступ к свойствам других окон в том же домене, что у них есть дескриптор на (обычно полученный через window.open/opener и window.frames/parent). Это обычно более управляемо для вызова функций, определяемых на другом окне, а не скрипке с переменными непосредственно.
Однако окна могут умереть или идти дальше, и соглашение о браузерах с ним по-другому, когда они делают. Проверьте, что окно (a) все еще открыто (! window.closed), и (b) имеет функцию, которую Вы ожидаете доступный, прежде чем Вы попытаетесь назвать его.
Простые значения как строки прекрасны, но обычно это не хорошая идея передать сложные объекты, такие как функции, элементы DOM и закрытия между окнами. Если дочернее окно хранит объект от своего новичка, то новичок закрывается, тот объект может стать 'мертвым' (в некоторых браузерах, таких как IE) или вызвать утечку памяти. Могут последовать странные ошибки.
Вам нужно сделать это в списке инициализаторов:
Bar(Foo* _foo) : foo(_foo) {
}
(Обратите внимание, что я переименовал входящую переменную в избегайте путаницы.)
You need to initialize foo in the initializer list.
class Bar {
Foo* const foo;
public:
Bar(Foo* f) : foo(f) {...}
};
Initializing const members and other special cases (such a parent classes) can be accomplished in the initializer list
class Foo {
private:
const int data;
public:
Foo(int x) : data(x) {}
};
Or, similarly, for parent initialization
class Foo {
private:
int data;
public:
Foo(int x) : data(x) {}
};
class Bar : Foo {
public:
Bar(int x) : Foo(x) {}
};
Используйте ссылку:
Foo& foo;
Bar(Foo& f) : foo(f) { }
Затем вы можете легко ссылаться на foo
в Bar
:
foo.doSomething();
I believe you must do it in an initializer. For example:
Bar(Foo* foo) : foo(foo) {
}
As a side note, if you will never change what foo points at, pass it in as a reference:
Foo& foo;
Bar(Foo& foo) : foo(foo) {
}