使用*const*或不使用*const*的类方法签名?

nad*_*gam 0 c++ const

尝试编译时,我在Eclipse中遇到以下错误(c ++)

../CardDeck.cpp:17:22:错误:将'const CardDeck'作为'int CardDeck :: size()'的'this'参数传递,丢弃限定符[-fpermissive]

如果我将int size()方法更改为int size()const,则错误消息将消失并且已编译.我不知道为什么?

.H文件如下:

  #include "Card.h"
#include <vector>

using namespace std;
class CardDeck{
    private:
        vector<Card*> deck;

    public:

        int size();
        CardDeck();
        CardDeck(const CardDeck& rhs);
        CardDeck& operator=(const CardDeck& rhs);
        Card& draw();
        Card& top();

        bool isEmpty();
        void clear();
        int value();
        CardDeck& operator+=(const CardDeck& rhs); /// not sure if to return ref
        CardDeck& operator+(const CardDeck& rhs);
        friend CardDeck&  operator*(unsigned int num,CardDeck& rhs);
        friend CardDeck&  operator*(CardDeck& lhs,unsigned int num);
        bool operator<=(const CardDeck& rhs );
        bool operator>=(const CardDeck& rhs);
        bool operator<(const CardDeck& rhs);
        bool operator>(const CardDeck& rhs);
        bool operator==(const CardDeck& rhs);
        bool operator!=(const CardDeck& rhs);
        Card*  operator[](int i);
};
Run Code Online (Sandbox Code Playgroud)

C++文件是:

#include "CardDeck.h"
int CardDeck::size() {
    return this->deck.size();
}
CardDeck::CardDeck(){};
CardDeck::CardDeck(const CardDeck& rhs){
    this->clear();
    int i;
    for (i=0;i<rhs.size();i++){
        Card* current_card = rhs.deck[i];
        Card* new_copy = new Card(*current_card);
        this->deck.push_back(new_copy);
    }


}
Card* CardDeck::operator[](int i) {
    return this->deck[i];
}



void CardDeck::clear(){
    vector<Card*>::iterator it ;
    for(it=this->deck.begin();it != this->deck.end();++it){
        Card* temp = *it;
        this->deck.erase(it);
        delete(temp);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 5

在复制构造函数中CardDeck::CardDeck(const CardDeck& rhs),rhs是对const CardDeck对象的引用.

因此,rhs.size()除非size()明确标记为存在,否则不会编译const.这就是你的编译器告诉你的.

最好让您的代码尽可能const正确,因为这样可以防止对类中成员数据的错误更改.真的,isEmpty()也可能value()应该标记const,所有重载的关系运算符也应如此.