c++ - 无法解析的外部问题 C++

  显示原文与译文双语对照的内容

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

wager.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

wager.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;

mainwindow.cpp


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

返回 LNK2001: -1: 错误:: 未解析的外部符号"class street1"(street1@@3VWager@@A )?

调试成功输出 street1Red Clicked

时间:

以下错误信息告诉你没有链接 Wager.cpp 文件,或者你没有实现一个函数。 在你的例子中你忘记给 Wager(); 函数定义

错误:LNK2001: 未解析的外部符号"class 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)
{
}

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

在 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;
}

对于类来说,事情有点复杂,因为这两个概念有点混乱。 例如,如果它们是一个完全相同的标记,并且所有标记都含有相同的含义,则提供两个定义。

还有一些类,如果不提供它们,则默认情况下会自动创建隐式方法。 例如当你编写时:


 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++的唯一方法是开始形成一本好书,并从封面读取。"。

我不得不从 wager.h, 中删除 Wager();,然后项目可以生成。 我不确定这个原因。 有谁知道?

...