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

指向指向对象的引用

  •  3
  • Jabba  · 技术社区  · 15 年前

    取消引用指针会使代码很难读取。我通常要做的是将引用放在指向的对象上,然后使用引用。例子:

    shared_ptr<std::vector<int> > sp = get_sp_to_vector();
    std::vector<int>& vec = *sp;
    ...
    vec.push_back(5);
    

    我想知道这是不是一种好的做法。有什么缺点吗?

    更新: 为了完成这个例子,我将定义 get_sp_to_vector() 方法如下:

    shared_ptr<std::vector<int> >  get_sp_to_vector()
    {
        // create a vector and send back a shared pointer pointing at it
        shared_ptr<std::vector<int> >  sp(new std::vector<int>);
        sp->push_back(1);  sp->push_back(3);
        return sp;
    }
    
    5 回复  |  直到 15 年前
        1
  •  2
  •   Roger Pate    15 年前

    使用局部引用是常见的,尤其是在循环体内部,但有一个要求:只有当引用明显地与目标对象一样长时才使用。

    这通常不难保证,但这里有一些坏例子:

    shared_ptr<X> p = get_p();
    X& r = *p;
    p.reset(); // might result in destroying r
    use(r); // oops
    
    // or:
    shared_ptr<X> p = get_p();
    X& r = *p;
    p = get_some_other_p(); // might result in destroying r
    use(r); // oops
    
        2
  •  2
  •   Community CDub    8 年前

    imho,我认为这是一种可以接受的做法(有一些注意事项-见 Roger Pate's 发布)。如果您只是为push_back()调用添加一行代码,那么我认为这是不可接受的。

    但是,如果您发现正在取消对指针的引用 许多的 有时,不仅是将它取消引用一次成为一个可接受的引用对象,它还可能是一个性能上的胜利(取决于您的编译器、有问题的代码、月亮的阶段等)。

        3
  •  2
  •   RC.    15 年前

    我不认为这是个好做法。指针是C/C++开发和B/C的主要逗留,C/C++编译器对指针所需的去引用语法感到满意。我尽量避免在可能的情况下使用指针(尽管不是出于语法原因),但有时它只是工作的最佳工具。如果您的代码是粗糙的b/c,那么您使用的是指针,我通常会将其反引用到一个函数中,该函数通过引用传递对象,它基本上完成了您所做的工作,但在我看来,它是以一种更优雅的方式完成的。因此,而不是:

    shared_ptr<std::vector<int> > sp = get_sp_to_vector();
    std::vector<int>& vec = *sp;
    ...ugly stuff...
    vec.push_back(5);
    

    我会这样做:

    void func(std::vector<int> &vec)
    {
         ... previously ugly stuff...
         vec.push_back(5);
    }
    
    shared_ptr<std::vector<int> > sp = get_sp_to_vector();
    func(*sp);
    

    编辑:
    这并不是说您应该简单地创建一个函数来为指针创建更好的语法,因为如果您不喜欢指针语法,并且您的代码使用干净简洁的函数,那么您可以简单地让函数在调用函数时获取引用并取消对指针的引用。对于只有几个调用*p或p & gt;x的情况,用引用创建一个函数或创建一个引用来调用P.x似乎是愚蠢的。在这些情况下只使用指针语法,因为这是C/C++语法。

    其他人提出在循环中使用引用,在循环中指针可能需要多次取消引用。我同意在这些情况下,参考资料是有益的。

        4
  •  1
  •   Roger Nelson    15 年前

    如果我真的在做指针操作,那么我会留下一个指针。 如果我的指针只是一个nillable引用,那么我将它保留为一个指针。 如果我有把握或想保证指针始终为非零 (即,如果我从方法返回非零对象),则 我用一个引用明确地说明了这一点。

        5
  •  1
  •   Steve Jessop    15 年前

    根据你提出的代码,我不同意:

    shared_ptr<std::vector<int> > sp = get_sp_to_vector();
    ...
    sp->push_back(5);
    

    是“很难读懂”。它也比你的代码短。所以,尽管我认为定义和使用本地引用没有什么错,但我也不认为你应该制定一个规则来总是这样做。

    也许,如果指针代码很难读取,那是因为您缺少了一些使其更简单的技巧。如果你用一个错误的指针代码的例子问另一个问题,你现在用一个引用来修复它,SOER可能会找到其他的修复方法。