我正在尝试将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/

10-11 00:48