C++ 使用非常量引用作为C++;
我试图在代码中正确使用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方式是你不想要的,因为你认为它是凌乱的。您的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
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转换返回值是可以的。同时拥有 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 !!!