代码之家  ›  专栏  ›  技术社区  ›  AshleysBrain

是否声明没有指针的默认参数循环引用?

  •  0
  • AshleysBrain  · 技术社区  · 16 年前

    // Forwards declaration of B
    class B;
    
    class A
    {
    public:
        // Default parameter referring to B.  May return its parameter
        const B& func(const B& b = B());
    };
    
    class B
    {
    public:
        // B ctors
        B() {}
        B(const B&) {}
    
        // B has A as a member
        A a;
    };
    

    Visual C++ 2008用这个告诉我:

    error C2514: 'B' : class has no constructors
    

    并指向B类的远期声明(“B类;”)显然看不到B的构造器。A无法跟随B,因为B包含A作为成员。

    如果必须使用间接法,那么最好的方法是什么?也许在C++0x B中,A可以是唯一的\u ptr成员?或者有一个boost类纯粹是为了回避这个问题?

    1 回复  |  直到 16 年前
        1
  •  7
  •   Tim Sylvester    16 年前

    B 通过引用和不带参数的引用。在不带参数的函数中,使用 B() ,这将起作用,因为该方法可以在

    ...
        void func();
        void func(const B& b);
    };
    
    class B...
    
    void A::func() { func(B()); }
    void A::func(const B&) { }
    

    func()返回常量B&。。。

    那可能不是个好主意。根据该定义,类似于:

    const B& foo = a.func();
    foo.bar();
    

    第一条语句完成后,您引用的内容将立即被销毁。通过引用返回类成员以外的内容通常是个坏主意。

    如果您真的想这样做,那么我认为您必须强制调用方显式传入 B()

    a.func(B()).bar();
    

    当然,你可以只返回一份副本而不是参考,但我想你有理由不这样做。

    shared_ptr 而不是引用,这样可以有效地忽略对象的生命周期。然而,您必须开始注意引用循环。

    Design Patterns 看看是否有一个既定的最佳实践。您可能会发现,这个小问题是不幸选择了类结构或包含的征兆。