未解决的外部问题c++
Unresolved external issue 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";
}
主窗口。obj:-1:错误:LNK2001:未解析的外部符号"class Wager street1" (?street1@@ 3vwager @@ a)
调试成功输出street1Red Clicked
下面的错误消息告诉你,要么你没有链接wanger .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)
{
}
这是一个链接错误,而不是编译错误。链接包含所需类的库。
在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++唯一合理的方法就是从一本好书开始,从头到尾读一遍……
我必须从wager.h中删除Wager();
,然后项目才能构建。不知道原因是什么。有人知道吗?
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题