【问题标题】:C++ object referencing in classes类中的 C++ 对象引用
【发布时间】:2011-09-16 20:03:53
【问题描述】:

我想知道如何将一个对象的引用存储在另一个对象中,并将该引用设置为私有属性。示例(伪代码):

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 类中。我知道如何简单地将它带入一个方法并在该方法的范围内使用它,但在这里我想将它设置为私有属性。我该怎么做呢?

【问题讨论】:

    标签: c++ class reference object-reference


    【解决方案1】:

    与您定义和使用任何类成员的方式相同。

    确保使用_member-initialiser初始化引用成员,而不是事后在构造函数主体中分配给它;回想一下,引用必须被初始化并且以后不能被反弹。

    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);
    

    【讨论】:

    • 是否必须在构造函数中完成,或者我可以为此提供单独的方法?
    • @Headspin:构造函数。 所有成员在构造过程中被初始化。总是。 (这就是建设的意义!)
    • 我想这对我来说是个问题,因为我需要先初始化 bar 类,然后再设置 foo 的引用。
    • @Headspin:你不能那样做。如果fooreference 是您的bar 的成员,那么它必须作为bar 初始化的一部分进行初始化。或许考虑改用shared_ptr<foo>?
    • 明白了。感谢您提供所有信息!
    【解决方案2】:
    bar::bar( foo & reference )
    {
        fooreference = reference;
    }
    

    fooreference 只是另一个对象。通过分配,您正在制作参考的副本。请注意,fooreference 不是 reference 的别名。

    【讨论】:

      【解决方案3】:

      你不能重新安装一个引用,所以你必须在初始化列表中设置它。

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

      【讨论】:

      • 实际上,将一个Foo 分配给另一个Foo 不会出错;不过,你会从省略初始化中得到一个。
      • @Tomalak Geret'kal 啊,是的,我的例子与我的意思并不接近。这将是一个复制/分配操作
      猜你喜欢
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多