【问题标题】:Referencing in c++ without passing by reference在 C++ 中引用而不通过引用传递
【发布时间】:2012-03-29 13:03:37
【问题描述】:

我有class Apublic std::list<int> object list_Class B,带有指向类 A a 的指针。

在类B的方法中...

std::list my_list = a->list_;
my_list.push_back(1);
my_list.push_back(2);
my_list.push_back(3);

我知道 my_list 实际上是 list_ 的副本,这就是为什么更改不会反映到原始列表中的原因。对于这个特定区域,我试图避免通过引用传递。无需执行以下操作...

a->list_.push_back(1);
a->list_.push_back(2);
a->list_.push_back(3);

我是否可以直接引用A中的list_对象,而不必每次都经过对象a

谢谢

【问题讨论】:

  • 更好的问题是为什么要避免传递引用?您可能会使问题复杂化,超出了您的需要。
  • 为什么您的list_ 成员是公开的?这是一种设计风格,您可能需要重新审视您的方法。

标签: c++ reference copy


【解决方案1】:

这应该可行:

std::list<int>& list = a->list_;
list.push_back(1);
list.push_back(2);
list.push_back(3);

基本上,我创建了一个引用A 实例的list_ 成员的局部引用变量。

【讨论】:

    【解决方案2】:

    您可以按照其他答案的说明使用reference

    在 C++11 中,您甚至可以这样做:

    auto add = [&](int n) {  a->list_.push_back(n); };
    
    add(1);
    add(2);
    add(3);
    

    没有a-&gt;,甚至没有list_,甚至没有push_back()。只需三个按键:add

    【讨论】:

    • 虽然不应该对过多的“本地函数”过于花哨,但很容易将维护者与符号爆炸混淆。当然这取决于,当然时间会过滤掉最佳实践。
    【解决方案3】:

    您为什么不想使用参考? this 或指针正是您要在此处使用的。

    std::list<int>& list = a->list_;
    

    std::list<int>* pList = &a->list_;
    

    使用指针或引用意味着通过a-&gt;list_.push_back( ... )pList-&gt;push_back( ... ) 的添加将是同一集合上的相同操作。

    【讨论】:

      【解决方案4】:

      是的,就像这样:

      std::list<int>& my_list = a->list_;
      

      【讨论】:

        【解决方案5】:

        使用参考?

        std::string a("This is a test");
        
        std::string& b = a;
        
        b[4] = 'L';
        
        std::cout << a << std::endl << b << std::endl;
        

        这里 &amp; 将 b 设为引用,因此您会看到两个字符串都通过更改 b 进行了更改。

        【讨论】:

          【解决方案6】:

          我很好奇你为什么不喜欢通过引用传递。

          您可以将成员函数添加到类 A 以处理成员列表的操作,而不是要求调用者调用列表本身的函数。不过,我不知道这是否适合您的用法。

          【讨论】:

            猜你喜欢
            • 2011-01-14
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 1970-01-01
            • 1970-01-01
            • 2022-01-11
            • 2014-07-05
            相关资源
            最近更新 更多