'.colorBet'左边必须有class / struct / union

时间:2013-01-01 20:27:10

标签: c++ class struct compiler-errors

尝试使用以下错误访问类Hand中的结构成员:错误:C2228:'。colorBet'的左边必须有class / struct / union

hand.h

    #ifndef HAND_H
#define HAND_H

#include"deck.h"
#include <QVector>
#include <QString>

struct street
{
    QString colorBet;
    int colorBetSize;
    int payout;
};

class Hand
{
    QVector<card> cardVector;

public:

    Hand(QVector<card> vCards);

    bool isFlush();
    bool isAllRed();
    bool isAllBlack();

    street street1;
    street street2;
    street street3;

};

#endif // HAND_H

mainwindow.cpp(底部错误)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "hand.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::build_radios(){
    street1BetBlack = new QRadioButton("Black");
    connect(street1BetBlack, SIGNAL(clicked()),
              this, SLOT(street1BetBlackClicked()));
    street2BetBlack = new QRadioButton("Black");
    connect(street2BetBlack, SIGNAL(clicked()),
              this, SLOT(street2BetBlackClicked()));
    street3BetBlack = new QRadioButton("Black");
    connect(street3BetBlack, SIGNAL(clicked()),
              this, SLOT(street3BetBlackClicked()));


    street1BetRed = new QRadioButton("Red");
    connect(street1BetRed, SIGNAL(clicked()),
              this, SLOT(street1BetRedClicked()));
    street2BetRed = new QRadioButton("Red");
    connect(street2BetRed, SIGNAL(clicked()),
              this, SLOT(street2BetRedClicked()));
    street3BetRed = new QRadioButton("Red");
    connect(street3BetRed, SIGNAL(clicked()),
              this, SLOT(street3BetRedClicked()));

    st1bg = new QButtonGroup;
    st2bg = new QButtonGroup;
    st3bg = new QButtonGroup;


    // button groups
    st1bg->addButton(street1BetBlack);
    st1bg->addButton(street1BetRed);
    st1bg->setExclusive(true);

    st2bg->addButton(street2BetBlack);
    st2bg->addButton(street2BetRed);
    st2bg->setExclusive(true);

    st3bg->addButton(street3BetBlack);
    st3bg->addButton(street3BetRed);
    st3bg->setExclusive(true);


}
void MainWindow::street1BetRedClicked()
{
    Hand::street1.colorBet="Red";        //error on every line similar to this
}
void MainWindow::street2BetRedClicked()
{
    Hand::street2.colorBet="Red";
}
void MainWindow::street3BetRedClicked()
{
    Hand::street3.colorBet="Red";
}
void MainWindow::street1BetBlackClicked()
{
    Hand::street1.colorBet="Black";
}
void MainWindow::street2BetBlackClicked()
{
    Hand::street2.colorBet="Black";
}
void MainWindow::street3BetBlackClicked()
{
    Hand::street3.colorBet="Black";
}

3 个答案:

答案 0 :(得分:2)

Hand::street1.colorBet="Red";&amp;其他人都是非法的,因为Hand::street1不是static类成员(我不是说它应该,static成员应该是一个逻辑决定,而不是你做的事情代码编译)。

您尝试修改哪个Hand对象,例如street1BetRedClicked?你有任何 Hand个对象吗?您需要任何Hand个对象吗?你用那种方法创造它们吗?外?

我指出了错误,但在我看来,这里的重要问题不是代码不能编译的事实,而是:

  1. 你似乎对C ++没有把握,也许你应该从简单的事情开始。

  2. 您没有明确的逻辑设置。

答案 1 :(得分:1)

当你像这样访问street1时,street1应该是Hand的静态字段。

如果每个Hand都有自己的street1对象,则应该访问对象的street1字段而不是静态字段。 如果您希望Hand的所有实例共享相同的street1,则应将street1设为静态。

你不理解这些概念,并且从阅读你的其他问题(example),我可以说你不完全了解C ++来编写这个程序。在你开始自己的项目之前,我建议你先阅读一本关于C ++的书或以其他方式学习C ++。

示例:

Hand hand1 = getRandomHand();
Hand hand2 = getRandomHand();

hand1.street1.colorBet="Red";
hand2.street1.colorBet="Black";

答案 2 :(得分:0)

您必须声明Hand类型的对象:

Hand hand;
hand.street1;
...

您也可以将街道字段声明为静态。