0

尝试使用外部声明的类对象,但收到错误。

赌注.h

#ifndef WAGER_H
#define WAGER_H
#include <QString>

void won_color_bets(int cardsDealt);


class Wager
{

    int bet;
    int payout;


public:

    bool didBet;
    bool won;
    QString colorBet;
    QString colorResult;

    Wager();
};

extern Wager street1;

#endif // WAGER_H

赌注.cpp

#include "wager.h"
#include "deck.h"
#include<QDebug>
#include<QVector>
#include<QList>
#include"mainwindow.h"


Wager street1;
Wager street2;
Wager street3;
Wager street4;
Wager street5;

主窗口.cpp

void MainWindow::street1BetRedClicked()
{
    street1.colorBet="Red";
    qDebug()<<"street1Red Clicked";
}

mainwindow.obj:-1:错误:LNK2001:未解析的外部符号“class Wager street1”(?street1@@3VWager@@A)

street1Red Clicked调试成功输出

4

4 回答 4

2

下面的错误消息告诉您没有链接 Wager.cpp 文件,或者您错过了实现一个功能。在你的情况下,你忘了给函数定义Wager();

错误:LNK2001:未解析的外部符号“class Wager street1”(?street1@@3VWager@@A)

要解决此问题,您需要Wager()在 Wager.cpp 或 Wager.h 中实施。我提供了一个示例实现Wager::Wager()默认构造函数:函数名与类名相同,参数为 0)。注意:下面的代码还初始化了成员初始化器列表中的所有类成员。

Wager::Wager()
:bet(0),
 payout(0),
 didBet(false),
 won(false),
 colorBet("blue"),
 colorResult("blue)
{
}
于 2012-12-29T07:59:04.250 回答
0

这是链接器错误,而不是编译器。链接包含所需类的库。

于 2012-12-29T07:40:16.433 回答
0

在 C++ 中,方法和函数可以“声明”或“定义”。

通过声明,您可以让编译器知道某个函数或对象将在程序中可用,即使此时没有提供例如实际的函数体。

通过定义,您实际上提供了函数体或对象的存储和初始化。

extern int foo;           // this is an integer DECLARATION

int foo = 4;              // this is the DEFINITION

double square(double x);  // function DECLARATION

// function DEFINITION
double square(double x) {
    return x*x;
}

对于类来说,事情有点复杂,因为这两个概念有点混乱。例如,提供两个定义在逻辑上是错误的,但在 C++ 中是允许的,前提是它们逐个标记绝对相同并且所有标记的含义相同。

此外,如果您不提供类,则默认情况下会自动创建隐式方法。例如当你写:

 class Point
 {
     public:
         double x, y;
 };

编译器会自动完成您的代码,就像您编写的一样

 class Point
 {
     public:
         double x, y;

         // default constructor
         Point()
         {
         }

         // copy constructor
         Point(const Point& other)
             : x(other.x), y(other.y)
         {
         }

         // assignment operator
         Point& operator=(const Point& other)
         {
             this->x = other.x;
             this->y = other.y;
             return *this;
         }

         // destructor
         ~Point()
         {
         }
 };

所有这些都是声明和定义。

但是,如果您只为隐式提供方法之一提供声明(就像您为类中的构造函数所做的那样),那么编译器会假定您想以不同的方式自己实现它,并且不会自动生成默认定义。

这是您的编译错误的原因:默认构造函数已声明但未定义,并且在组装可执行文件时编译器缺少某些部分。

另请注意,C++ 是一种非常复杂的语言,有很多明显不合逻辑(有时只是不合逻辑)的部分,不适合通过实验来学习。学习 C++ 的唯一合理方法是开始编写一本好书并从头到尾阅读...

于 2012-12-29T08:28:20.850 回答
-1

我必须Wager();从 wager.h 中删除,然后才能构建项目。不确定原因。有人知道吗?

于 2012-12-29T07:51:31.203 回答