пытается использовать внешне объявленный объект класса, но получает ошибку.
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
успешно
В приведенном ниже сообщении об ошибке сообщается, что вы не связали файл Wager.cpp или пропустили реализацию одной функции. В вашем случае вы забыли дать определение функции Wager();
ошибка: LNK2001: неразрешенный внешний символ «класс 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();
из wager.h, то проект можно построить. Не уверен в причине этого. Кто-нибудь знает?