请查看以下代码
Weapon.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();
};
**
Weapon.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);
每当我删除它,代码工作正常!!
stack1
是Stack类的对象,其中堆栈类的构造函数接受整数参数。 Stack
类是一个模板,位于头文件
如何摆脱这个错误?
请帮忙!
答案 0 :(得分:2)
嗯,你声明一个你没有提供定义的函数:
class Weapon : public GameObject
{
public:
...
Stack <Round> *stack1(int rounds) ; // <=== DECLARATION IS HERE,
// DEFINITION IS NOWHERE
...
};
显然,链接器抱怨它无法找到Weapon::stack1()
的定义。
每当我删除它,代码工作正常!!
难怪,您不再需要调用已声明但尚未定义的函数。您应该将Weapon::stack1()
的定义添加到您的实现文件中:
<强> Weapon.cpp 强>
...
Stack<Round>* stack1(int round)
{
...
}
<强>更新强>
中
stack1
是Stack
类的对象,其中堆栈类的构造函数接受整数参数。Stack
类是一个模板,位于头文件
当我第一次回答这个问题时,我忽略了这一部分。
因此,即使您声明函数,您的意图似乎是将指针声明为Stack<Round>
类型的对象。在这种情况下,忘记定义stack1()
函数,正如我在原始答案中所建议的那样。只需使用正确的语法来声明指针成员变量:
<强> Weapon.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>
对象并分配指针:
<强> Weapon.cpp 强>
Weapon::Weapon(int size)
{
stack1 = new Stack<Round>(size);
}
此外,请不要忘记delete stack1
的析构函数中的Weapon
:
Weapon::~Weapon(int size)
{
if (stack1)
{
delete stack1;
}
}
答案 1 :(得分: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)
{ }
答案 2 :(得分:1)
在武器构造函数中尝试:
stack1=new Stack <Round>(size);
同时更新Weapon.h:
Stack <Round> *stack1;