繁体   English   中英

未解决的外部问题C ++

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM