qt — нерешенная внешняя проблема переполнение стека

пытается использовать внешне объявленный объект класса, но получает ошибку.

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 успешно

0

Решение

В приведенном ниже сообщении об ошибке сообщается, что вы не связали файл 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)
{
}
2

Другие решения

Это ошибка компоновщика, а не компилятор. Связать библиотеку, содержащую необходимый класс.

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 ++ — это начать хорошая книга и читать его от корки до корки …

0

Я должен был удалить Wager(); из wager.h, то проект можно построить. Не уверен в причине этого. Кто-нибудь знает?

-1
По вопросам рекламы [email protected]