0

外部で宣言されたクラス オブジェクトを使用しようとしましたが、エラーが発生しました。

賭け.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

賭け.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;

メインウィンドウ.cpp

void MainWindow::street1BetRedClicked()
{
    street1.colorBet="Red";
    qDebug()<<"street1Red Clicked";
}

mainwindow.obj:-1: エラー: LNK2001: 未解決の外部シンボル "class Wager street1" (?street1@@3VWager@@A)

デバッグはstreet1Red Clicked正常に出力されています

4

4 に答える 4

2

以下のエラー メッセージは、Wager.cpp ファイルがリンクされていないか、1 つの関数の実装に失敗したことを示しています。あなたの場合、関数定義を与えるのを忘れましたWager();

エラー: LNK2001: 未解決の外部シンボル "class 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)
{
}
于 2012-12-29T07:59:04.250 に答える
0

これはリンカーエラーであり、コンパイラーではありません。必要なクラスを含むライブラリをリンクします。

于 2012-12-29T07:40:16.433 に答える
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;
}

クラスについては、2 つの概念が少し混乱しているため、もう少し複雑です。たとえば、2 つの定義を提供することは論理的には不適切ですが、トークンごとに完全に同一であり、すべてのトークンの意味が同じである場合、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()
         {
         }
 };

これらはすべて、宣言と定義の両方です。

ただし、 (クラスのコンストラクターに対して行ったように) 暗黙的に提供されるメソッドの 1 つの宣言のみを提供すると、コンパイラーは別の方法でそれを自分で実装したいと想定し、デフォルトの定義は自動的に生成されません。

これがコンパイル エラーの原因です。デフォルトのコンストラクターが宣言されていましたが、定義されておらず、実行可能ファイルをアセンブルするときにコンパイラーにいくつかの部分がありませんでした。

また、C++ は非常に複雑な言語であり、明らかに非論理的な (場合によっては単に非論理的な) 部分が多く、実験による学習には適していないことにも注意してください。C++ を学ぶための唯一の合理的な方法は、良い本から始めて、最初から最後まで読むことです...

于 2012-12-29T08:28:20.850 に答える
-1

Wager();プロジェクトをビルドできるように、wager.hから削除する必要がありました。この理由はわかりません。誰か知っていますか?

于 2012-12-29T07:51:31.203 に答える