当对象封装在 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
关键字不会在此处添加任何有用的内容,因此您可以将其删除。
让我更清楚地提出问题。
我有一个数据行对象:
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
关键字不会在此处添加任何有用的内容,因此您可以将其删除。