0

次のコードを見てください

武器.h

**

#pragma once
#include "GameObject.h"
#include "Stack.h"
#include "Round.h"
class Weapon :
    public GameObject
{
public:
    Weapon(int);
    ~Weapon(void);
    Stack <Round> *stack1(int rounds) ;
    Weapon *next;
    void display();
};

**

武器.cpp

#include "Weapon.h"
#include <iostream>

using namespace std;

Weapon::Weapon(int size)
{
    stack1(size);
}


Weapon::~Weapon(void)
{
}

void Weapon::display()
{
    cout << "Weapon Id: " << id << endl;
}

上記はプロジェクト コードの 2 つのファイルにすぎないことに注意してください。ただし、実行すると次のエラーが発生します

1>------ Build started: Project: stacksCheck, Configuration: Debug Win32 ------
1>  Weapon.cpp
1>Weapon.obj : error LNK2001: unresolved external symbol "public: class Stack<class Round> * __thiscall Weapon::stack1(int)" (?stack1@Weapon@@QAEPAV?$Stack@VRound@@@@H@Z)
1>C:\Users\yohan\Documents\Visual Studio 2010\Projects\CourseWork2\Debug\CourseWork2.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

このエラーはここから来ていると100%確信しています

stack1(size);

これを削除すると、コードは正常に動作します!!

stack1Stack クラスのコンストラクターが整数パラメーターを受け入れる Stack クラスのオブジェクトです。Stackクラスは、ヘッダー ファイルにあるテンプレートです。

このエラーを取り除くにはどうすればよいですか?

助けてください!

4

3 に答える 3

2

さて、定義を提供しない関数を宣言します。

class Weapon : public GameObject
{
public:
    ...
    Stack <Round> *stack1(int rounds) ; // <=== DECLARATION IS HERE,
                                        //      DEFINITION IS NOWHERE
    ...
}; 

明らかに、リンカは の定義が見つからないと文句を言いますWeapon::stack1()

これを削除すると、コードは正常に動作します!!

当然のことながら、宣言されているがまだ定義されていない関数を呼び出す必要はもうありません。Weapon::stack1()の定義を実装ファイルに追加する必要があります。

武器.cpp

...

Stack<Round>* stack1(int round)
{
    ...
}

アップデート:

stack1Stackスタッククラスのコンストラクターが整数パラメーターを受け入れるクラスのオブジェクトです。Stackクラスは、ヘッダー ファイルにあるテンプレートです。

最初に質問に答えたとき、私はこの部分を見落としていました。

したがって、関数を宣言していても、タイプのオブジェクトへのポインターを宣言することが意図されているようStack<Round>です。stack1()その場合、元の回答で提案したように、関数の定義を忘れてください。ポインター メンバー変数を宣言するための正しい構文を使用するだけです。

武器.h

class Weapon : public GameObject
{
public:
    ...
    Stack<Round>* stack1; // IF YOU WANT TO DECLARE A MEMBER POINTER,
                          // THIS IS THE CORRECT SYNTAX.
    ...
}; 

次に、Weaponクラスのコンストラクターで、Stack<Round>オブジェクトを構築してポインターを割り当てることができます。

武器.cpp

Weapon::Weapon(int size)
{
    stack1 = new Stack<Round>(size);
}

delete stack1また、 inWeaponのデストラクタを忘れないでください:

Weapon::~Weapon(int size)
{
    if (stack1)
    {
        delete stack1;
    }
}
于 2013-02-26T14:52:58.877 に答える
1

stack1が (関数ではなく)のデータ メンバーであると想定される場合はWeapon、次のように宣言する必要があります。

class Weapon :
    public GameObject
{
public:
    Weapon(int);
    ~Weapon(void);

    Stack <Round>   stack1;
    Weapon *next;

    void display();
};

Weapon次に、コンストラクターで初期化します

Weapon::Weapon(int size) : stack1(size)
{ }
于 2013-02-26T14:58:03.613 に答える
1

Weapon コンストラクターでこれを試してください。

stack1=new Stack <Round>(size);

Weapon.h も更新します。

 Stack <Round> *stack1;
于 2013-02-26T14:59:03.810 に答える