对 c++ 类的怀疑

Posted

技术标签:

【中文标题】对 c++ 类的怀疑【英文标题】:Doubts about c++ classes 【发布时间】:2016-02-15 15:48:58 【问题描述】:

我正在做一个关于纸牌游戏的简单 c++ 项目,我正在使用以下类来表示纸牌:

class card
public:
    int suit;
    int value;
    bool check;//i need it for various things
    card(): suit(0), value(0), check(false) 
    void set_check(bool a)check=a;
    void card_name(); //given a card name, it generate the suit and value of the card
    string suit_name(int); //print card suit name
    string value_name(int);//print card value name
;

现在,这是我第一次使用类,所以我有一些疑问:

1) 我第一次使用card这个类时,它没有任何默认构造函数,是这样的:

class card
public:
    int suit;
    int value;
    void card_name();
    string suit_name(int);
    string value_name(int);
;

每当我需要初始化卡时,我都会执行card a=0,0; 之类的操作。使用新类,构造函数初始化对象,但在某些函数中,我使用语法card a=suit,value; 将数字分配给成员suitvalue。它以前工作过,但是使用构造函数会显示错误 error: no match for ‘operator=’ (operand types are ‘card’ and ‘<brace-enclosed initializer list>’)error: could not convert ‘0, 0’ from ‘<brace-enclosed initializer list>’ to ‘card’

我知道如何避免这种情况(我将添加一个 set_values 成员函数),但我只是好奇究竟是什么导致了这种情况发生(是因为 ... 是一个初始化程序并导致双重初始化吗?)。

2) 除了使用构造函数之外,是否有其他方法可以将类的成员设置为默认值(即我需要将 check 初始化为 false,除非我通过 @987654333 显式更改它@)?如果我这样定义类

class card
public:
    int suit;
    int value; 
    bool check=false;
    void set_check(bool a)check=a;
    void card_name();
    string suit_name(int);
    string value_name(int);
;

它会起作用吗?而且,假设上面的类,我可以简单地通过card a=0,0 初始化一个对象而不指定check 值吗?

3) 最后也是最不重要的,所以不要太在意。我想知道是否有一种方法可以在不使用数组的特定构造函数的情况下对card 数组中的元素进行初始化和赋值。我的意思是,假设类是

class card
    int suit;
    int value;
    bool check;
    card(int a, int b, bool c=false): suit(a), value(b), check(c) 
   //other functions
;

当我在没有构造函数的情况下使用类 card 时,我声明了以下数组 card array[5]=1,1,2,3,3,5, ...,但它给我上面第 1 点的新构造函数带来了问题。

我在另一个论坛上看到它被允许做这样的事情

card array[5]=card(1,1), card(2,3), card(3,5), ...

即使用大括号封闭的初始化程序初始化数组并在大括号内调用构造函数。这真的允许吗?有没有其他方法可以使用构造函数来做这样的事情?

【问题讨论】:

【参考方案1】:

回复:1

card a=suit,value;

不起作用,因为您有明确定义的默认构造函数。您可以使用另一个构造函数来使其工作。

card(int s, int v): suit(s), value(v), check(false) 

回复:2

是的,

bool check=false;

是将check初始化为false的好方法。

回复:3

如果你定义了第二个构造函数,你应该可以使用:

card array[5]=1,1,2,3,3,5, ...;

【讨论】:

快速准确,谢谢!第三个问题的答案也有效

以上是关于对 c++ 类的怀疑的主要内容,如果未能解决你的问题,请参考以下文章

C++ 程序为某些输入抛出正确的答案,而为其他输入抛出错误的答案。我怀疑数据类型溢出

信仰与怀疑

对身份验证技术的怀疑 - 护照

对移位行为的怀疑

对单元测试 DAO 的怀疑

对 t.test 结果的怀疑