c++ - 成员是私有(private)的,C++ 中的运算符重载

标签 c++

<分区>

我想创建卡片类,其中有方法打印和重载运算符(卡片比较)

这是我的代码:

#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
using namespace std;

enum Face {Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen,King, Ace};
enum Suit {Hearts,Clubs,Diamonds,Spades};

class Card{
private:
    Face face;
    Suit suit;

public:
    Card();
    Card(const Face face,const Suit suit);
    void print();
    friend bool operator>(Card& lhs,Card&rhs);
    friend bool operator==(Card& lhs,Card& rhs);
    friend bool operator!=(Card& lhs,Card& rhs);
    friend bool operator<(Card& lhs,Card& rhs);

};

const char* to_string_1(const Face value)
{
    const char* LUT[] = {"Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King", "Ace" };
    return LUT[value];
}

const char* to_string_2(const Suit value)
{
    const char* LUT[] = {"Hearts", "Clubs", "Diamonds", "Spades" };
    return LUT[value];
}



Card::Card(){
}

Card::Card(Face rank_card,Suit suit_card){
    face = rank_card;
    suit = suit_card;
}




void Card::print(){
    cout << to_string_1(face) << " " <<  to_string_2(suit);
}



bool operator==(const Card& lhs, const Card& rhs){
    if(lhs.face == rhs.face && lhs.suit == rhs.suit) return true;
    return false;
}

bool operator!=(const Card& lhs,const Card& rhs){
    if(lhs.face != rhs.face || lhs.suit != rhs.suit) return true;
    return false;
}

bool operator>(const Card& lhs,const Card& rhs){
    if(lhs.face > rhs.face && lhs.suit > rhs.suit) return true;
    if(lhs.face > rhs.face && lhs.suit == rhs.suit) return true;
    if(lhs.face == rhs.face && lhs.suit > rhs.suit) return true;
    return false;
}

bool operator<(const Card& lhs,const Card& rhs){
    if(lhs.face < rhs.face && lhs.suit < rhs.suit) return true;
    if(lhs.face < rhs.face && lhs.suit == rhs.suit) return true;
    if(lhs.face == rhs.face && lhs.suit < rhs.suit) return true;
    return false;
}

int main(){
    Card c_1(Two,Clubs);
    Card c_2(Five,Diamonds);
    c_2.print();
}

问题是,编译器向我抛出错误,例如:

12:10: 错误:'Face Card::face' 是私有(private)的 58:24:错误:在此上下文中 13:10: 错误:'Suit Card::suit' 是私有(private)的 58:36:错误:在此上下文中

但我将运算符定义为“友元”函数。为什么程序仍然报错?

最佳答案

friend 的签名和声明必须完全匹配。比较

friend bool operator>(Card& lhs,Card&rhs);

bool operator>(const Card& lhs,const Card& rhs){

您在 friend 声明中忘记了您的const

关于c++ - 成员是私有(private)的,C++ 中的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47622344/

相关文章:

c++ - UDP WinSock - 未接收广播数据包

c++ - 数据类型的名称从何而来?

c++ - 抑制 emacs 中的 c++ 命名空间缩进

android - 如何将动态 C++ 库添加到 Android 源?

c++ - 如何从 C++ 中的基类构造函数调用派生类方法?

c++ - 如何使用 gtest 设置测试名称

c++ - Qt 代码编辑器在右侧区域显示行号

c# - 将代码段从 C++ 转换为 C#

c++ - LoadLibrary 在 x64 上最新版本的 Visual C++ 上返回 193

c++ - 如何使用 C++ 模板实现 int、string、float 和 date 对象的数组?