2012-12-29 6 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)

debug выводит 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(); из wager.h, тогда проект может быть построен. Не уверен в причине этого. Кто-нибудь знает?

+2

, тогда мой комментарий верен, вы не внедрили функцию Wager(), а просто объявили его. – billz

+0

Если вы объявите метод, он также должен быть реализован. Если это не чистый виртуальный метод. –

0

В 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++ - начать формировать форму good book и читать ее с крышки на обложку ...