Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用非常量引用作为C++;_C++_Constants - Fatal编程技术网

C++ 使用非常量引用作为C++;

C++ 使用非常量引用作为C++;,c++,constants,C++,Constants,我试图在代码中正确使用const关键字。 我有一个类a,其中有一些其他类B,std::array作为成员变量 我有一个访问器来获取A的B成员之一 我在其他类似的类上也有这个问题,并且const重载了更多的方法。 对我来说,这种修改似乎是一团糟。 我想我错过了实现目标的更简洁的方法(使用const a&as序列化程序参数) 我只使用const A实例返回的非const B实例引用的const成员。 在这里我应该重构什么样的代码来遵循C++的好实践? 我只使用const A实例返回的非const B

我试图在代码中正确使用const关键字。 我有一个类a,其中有一些其他类B,std::array作为成员变量

我有一个访问器来获取A的B成员之一

我在其他类似的类上也有这个问题,并且const重载了更多的方法。 对我来说,这种修改似乎是一团糟。 我想我错过了实现目标的更简洁的方法(使用const a&as序列化程序参数)

我只使用const A实例返回的非const B实例引用的const成员。 在这里我应该重构什么样的代码来遵循C++的好实践? 我只使用const A实例返回的非const B实例引用的const成员。在这里我应该重构什么样的代码来遵循C++的好实践? <> P>干净的iDoad方式是你不想要的,因为你认为它是凌乱的。您的
A
应该是这样的

class A
  {
    public:
      B& getB(size_t idx)    
      {
        return m_bCollection[idx];
      }
      const B& getB(size_t idx) const {
        return m_bCollection[idx];
      }   
    private:
      std::array<B, 10> m_bCollection;
  };

最后但并非最不重要的一点:我认为这是由于简化了示例,但您的
getA
看起来像是一种封装尝试。事实并非如此。一旦您返回了对成员的非常量引用,您也可以将该成员
公开。
getB
的唯一用途是,您可以编写
a.getB(index)
而不是
a.m\u bCollection[index]
,但它不能实现封装
是正确的方法,您可以将您的成员
const
放置得越多越好。注意:您还可以拥有
const
和非
const
版本的成员。这应该会有所帮助。它也是一个有效C++中的项目。将const转换为const并丢弃const转换返回值是可以的。同时拥有 > const ,而不是<代码> const 重载是干净的C++。这能回答你的问题吗?我看不出它有多“肮脏和黑”,至少不比必须复制和粘贴。。。在C++17中,它看起来已经好多了,可以添加一个快速助手函数使它看起来更好:@underline\u d它在我的内存中更粗糙;)。修正了那部分
  YAML::Emitter& operator<<(YAML::Emitter& out, const A& a)
  {
    // some stuff here, and then:
    out << a.getB(1).getMember();

    return out;
  }
  B& A::getB(const size_t idx);
  const B& A::getB(const size_t idx) const;
class A
  {
    public:
      B& getB(size_t idx)    
      {
        return m_bCollection[idx];
      }
      const B& getB(size_t idx) const {
        return m_bCollection[idx];
      }   
    private:
      std::array<B, 10> m_bCollection;
  };
std::ostream& operator<<(std::ostream&, const A&); 
                                       // ^--------  const !!!