我正在尝试将std::sort与自定义比较功能一起使用。为此,我有一个名为trySort
的类。这是trySort
类的示例代码:
trySort.h
class trySort {
public:
private:
std::string sortThis;
};
trySort.cpp
bool sortThisAsc (const trySort & rhs , const trySort & lhs) {
return lhs.sortThis > rhs.sortThis;
}
如果成员
sortThis
是私有(private)的,这将引发错误。如果我让
sortThis
这样的公共(public)成员...trySort.h
class trySort {
public:
std::string sortThis;
private:
};
trySort.cpp
bool sortThisAsc (const trySort & rhs , const trySort & lhs) {
return lhs.sortThis > rhs.sortThis;
}
...它将起作用。好像我将
sortThis
设为公共(public)成员。所以我的问题是:如果要这样做,是否不封装数据?
如果是这样,除了将其作为公共(public)成员外,还有哪些其他可能的方法?
最佳答案
您可以将operator >
添加到trySort
类。
trySort.h
class trySort {
public:
bool operator >(trySort const &other) {
return sortThis > other.sortThis;
}
private:
std::string sortThis;
}
如果您需要更大的灵活性(一些其他类型的比较),只需使用getter函数封装
sortThis
。trySort.h
class trySort {
public:
std::string const &getSortThis() const {
return sortThis;
}
private:
std::string sortThis;
}
如果您完全确定
sortThis
在项目过程中始终是不可变的,并因此在构造函数中进行了初始化,则可以将其保留为公共(public)const成员,但是在大多数情况下,这是一种推测性的方法。trySort.h
class trySort {
public:
trySort(std::string const sortThis)
: sortThis(sortThis) {
}
const std::string sortThis;
}
或者,您也可以使用
friend
做到这一点,但我还是把它留作最后的选择,因为在大多数情况下,这表明它代表了过度的亲密关系(总有其他方法可以避免使用friend
)。在某些情况下,使用friend
可能是适当的,但是它至少不会破坏封装,不同之处在于friend
子句向类的客户端发出信号表明故意破坏了。关于c++ - c++封装问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21043421/