2012-12-29 37 views
0

尝试使用外部声明的类对象,但收到错误。无法解析的外部问题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"; 
} 

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

调试正在输出street1Red Clicked成功

+3

您链接了cpp吗? – chris

+0

是的,我清理并运行qmake,文件链接 – chuckieDub

+2

你还没有实现Wager :: Wager()? – billz

回答

2

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

error: LNK2001: unresolved external symbol "class Wager street1" ([email protected]@[email protected]@A)

要解决这个问题,你需要实现Wager()的地方,无论是在Wager.cpp或Wager.h。 我提供Wager::Wager()的示例实现(默认构造函数:函数名称与类名称相同,并且采用0参数)。 注意:下面的代码还初始化成员初始值设定项列表中的所有类成员。

Wager::Wager() 
:bet(0), 
payout(0), 
didBet(false), 
won(false), 
colorBet("blue"), 
colorResult("blue) 
{ 
} 
0

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

+1

我自己添加了新的类,没有使用任何库... – chuckieDub

-1

我不得不从wager.h中删除Wager();,那么项目就可以建立。不确定的原因。有人知道吗?

+2

然后我的评论是正确的,你没有实现Wager()函数,但只是声明它。 – billz

+0

如果你声明了一个方法,它也必须实现。除非它是一种纯粹的虚拟方法。 –

0

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

随着声明你让编译器知道某个函数或对象在程序中可用,即使没有提供例如当前的实际函数体。

With definition您实际上提供了函数体或对象的存储和初始化。

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++的唯一合理的方法是从good book开始并从封面读取它以覆盖...