【问题标题】:Get access to a variable in a class without copying it无需复制即可访问类中的变量
【发布时间】:2022-01-03 06:11:39
【问题描述】:

我想在不复制类的情况下访问字段。

我有一个存储两个变量的类(这里是简化版)。 在get_cutting_types 方法中,我检查用户输入truefalse 的位置并通过引用将对象传回。但是这里我必须使用=,意思是数据被复制了。

有没有直接传递字段而不重新分配的方法?

class joint
{
    std::vector<char> m_letters;
    std::vector<char> f_letters;

    void get_cutting_types(bool flag, std::vector<char>& letters) {
        if (flag) {
            letters= m_letters;
        } else {
            letters= f_letters;
        }
    }
}

【问题讨论】:

  • 这是一个木接缝...
  • 在这种情况下,我相信它是。不是吗?
  • @alterigel 我无权访问实际的 ISO C++ 规范 :(
  • get_cutting_types 应该返回std::vector&lt;char&gt;&amp;,即对m_boolean_typef_boolean_type 的引用。
  • @PeteBecker,所以实际上写“=”没有副本?

标签: c++ getter-setter


【解决方案1】:

这里有很多东西要解压,但是:

  • 我认为您将无法避免在途中使用“=”符号。而且我看不出有任何问题的原因。

  • 如果您只想返回一个布尔值:那么也许只需向您的类添加一个新的公共方法,例如

    public:
      bool isMale() { return <<some test>>; } // Easy peasy!
    

问:这是否解决了您的顾虑?

问:还是你需要“别的东西”?如果是这样,请澄清。


抱歉,变量命名的代码可能有混淆。它是 只有一个 char 的返回值,而不是一个布尔标志。

好的,也许你想要这样的东西:

public:
    const std::vector<char>& get_cutting_types(bool is_male) {
      return (is_male) ? m_letters : f_letters; 
    }

【讨论】:

  • 对不起,变量命名的代码可能有混淆。它只是 char 的返回值,而不是单个布尔标志。
  • 啊,我忘了可以通过引用返回值...谢谢
  • 为什么它是 const 有什么原因吗?只是不改变初始值?
  • @Petras 这取决于get_cutting_types 的调用者是否应该能够改变向量。我认为他们不应该(因此返回类型应该是const vector&lt;char&gt;&amp;),因为get_cutting_types 返回对class joint拥有 对象的引用。我的意见是只有对象的独占所有者 应该能够改变它,所有其他对象应该只具有他们不拥有的数据的只读视图。也就是说,添加内联文档以使其清晰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2014-12-13
相关资源
最近更新 更多