Ссылка на объект C ++ в классах - PullRequest
2 голосов
/ 17 сентября 2011

Мне интересно, как сохранить ссылку на объект внутри другого объекта, а также установить эту ссылку как частное свойство.Пример (псевдокод):

class foo
{
    public:
        int size;
        foo( int );
};

foo::foo( int s ) : size( s ) {}

class bar
{
    public:
        bar( foo& );
    private:
        foo fooreference;
};

bar::bar( foo & reference )
{
    fooreference = reference;
}

foo firstclass( 1 );
bar secondclass( firstclass );

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

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

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

Убедитесь, что вы инициализировали ссылочный элемент с помощью _member-initializer, а не просто присваиваете ему значение "за фактом" в теле конструктора; Напомним, что ссылки должны быть инициализированы и не могут быть позже восстановлены.

class foo
{
    public:
        int size;
        foo( int );
};

foo::foo( int s ) : size( s ) {}

class bar
{
    public:
        bar(foo&);
    private:
        foo& fooreference;
};

bar::bar(foo& reference) : fooreference(reference)
{}

foo firstclass(1);
bar secondclass(firstclass);
1 голос
/ 17 сентября 2011
bar::bar( foo & reference )
{
    fooreference = reference;
}

fooreference - это просто еще один объект.Назначая, вы делаете копию ссылки.Обратите внимание, что fooreference не является псевдонимом reference.

1 голос
/ 17 сентября 2011

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

struct Foo {};

struct Bar {
  Bar(Foo &foo_) : foo(foo_) {}
  void set(Foo &foo_) { foo = foo_; } // copies, doesn't reseat
  Foo &foo;
};
...