初始化指向模板的指针时未解析的外部符号

时间:2013-02-26 14:50:20

标签: c++ visual-studio-2010 pointers stack

请查看以下代码

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类是一个模板,位于头文件

如何摆脱这个错误?

请帮忙!

3 个答案:

答案 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)
{
    ...
}

<强>更新

  

stack1Stack类的对象,其中堆栈类的构造函数接受整数参数。 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;