当对象封装在 const class 中时,如何使用该对象的访问器方法?

How to make use of an accessor method of an object when that object is encapsulated within a const class?

让我更清楚地提出问题。

我有一个数据行对象:

 Class Datarow {
    private: 
      vector<string> vals;          

    public:

    std::string getVal(int index); //returns vals.at(index)
    };

我有一个包含数据行的 Section 对象:

 Class Section {
    private: 
      vector<Datarow> rows;          

    public:
      //Section methods
    };

我有一个超载:

 inline friend std::ostream& Section::operator<<(std::ostream& os, const Section& sec)
 {

   for(auto& row : sec.rows) {
       if( sec.row.getVal(0) == "Tom" )  //<-- error here, c++ doesnt like me calling any method of 
           os << row << endl;       // "row", since sec is const
   }  

 }
 

假设我们也为 Datarow 重载了 << 运算符。一种解决方案可能是不使用 auto&,但如果我有很多行,每次复制“行”可能会很昂贵。我无法通过 const Section sec&,但这也可能很昂贵。这个问题有没有优雅的解决方案?

正确的做法是将必要的Datarow方法变成const方法,像这样:

std::string getVal(int index) const;
                          //  ^^^^^   add this

现在可以在 const 对象上调用这些方法,就像您在 operator<< 中所做的那样。

此外,您的 operator<< 是一个 friend 函数,不应使用 Section:: 限定,如下所示:

friend std::ostream& operator<<(std::ostream& os, const Section& sec)
{
   // ...
}

此外,inline关键字不会在此处添加任何有用的内容,因此您可以将其删除。