[英]Unresolved external issue c++
尝试使用外部声明的类对象,但收到错误。
赌注
#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
下注
#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;
主窗口
void MainWindow::street1BetRedClicked()
{
street1.colorBet="Red";
qDebug()<<"street1Red Clicked";
}
mainwindow.obj:-1:错误:LNK2001:未解析的外部符号“ Wager street1类”(?street1 @@ 3VWager @@ A)
调试输出street1Red Clicked
成功street1Red Clicked
下面的错误消息告诉您或者您尚未链接Wager.cpp文件,或者您错过了实现一个功能的过程。 在您的情况下,您忘记为Wager();
提供函数定义了Wager();
错误:LNK2001:无法解析的外部符号“类Wager street1”(?street1 @@ 3VWager @@ A)
若要解决此问题,您需要在Wager.cpp或Wager.h中的某个地方实现Wager()
。 我为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;
}
对于类来说,事情有点复杂,因为这两个概念有些混乱。 例如,提供两个定义在逻辑上是很糟糕的,但是如果C ++逐个标记完全相同并且所有标记的含义相同,则在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 ++的唯一合理方法是开始写一本好书,然后从头到尾阅读它。
我不得不删除Wager();
从下注.h,然后就可以构建项目了。 不确定原因。 有人知道吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.