【问题标题】:Cannot declare variable 'x' to be of abstract type 'Queue<int>' [closed]无法将变量“x”声明为抽象类型“队列<int>”[关闭]
【发布时间】:2016-07-04 04:57:25
【问题描述】:

我正在构建一个从抽象类继承的 Queue 类,当我测试我的构造函数时,我一直遇到这个错误,我不明白为什么:

“不能将变量‘x’声明为抽象类型‘队列’”

"因为下面的虚函数在'Queue'中是纯的"

"void Abstractclass::pop() [Elem=int]"

MAIN.CPP:

#include "abstractclass.h"
#include "queue.h"
#include "stack.h"
#include <iostream>
#include <conio.h>
using namespace std;

int main()
{

Queue<int> x(10);


getch();

return 0;
}

抽象类.H:

#ifndef ABSTRACTCLASS_H
#define ABSTRACTCLASS_H
#include <iostream>

using namespace std;

template <class Elem>
class Abstractclass
{
    public:
    Abstractclass();
    virtual ~Abstractclass();
    virtual void pop()=0;
};

#endif // ABSTRACTCLASS_H

队列.H:

#ifndef QUEUE_H
#define QUEUE_H
#include "abstractclass.h"

template <class Elem>
class Queue: public Abstractclass <Elem>
{
    public:
        Queue(int);
       ~Queue();
        void Pop(const Elem &item);
    private:
        Elem *data;
        const int maxsize;
        int firstdata;
        int lastdata;
        int queuesize;
};

#endif // QUEUE_H

【问题讨论】:

  • void pop()void Pop(const Elem &amp;item) 不同。你需要在派生类中实现void pop()
  • OT:void Pop(const Elem &amp;item); 应该怎么做?对于我对队列的理解,这看起来不正确....
  • @CaptainObvlious 您好,非常感谢您的回答。现在我更正了这个问题,我得到一个“未定义的对 'Queue::Queue(int) 的引用”错误你知道原因吗??
  • 因为你没有定义那个构造函数。找一本关于 C++ 的好书,从基础开始。
  • @JonathanWakely 好吧,Pretentious 先生

标签: c++ templates inheritance polymorphism pure-virtual


【解决方案1】:

在类队列中:

virtual void pop( );

并且拼写它是 pop,而不是 Pop,会修复它。 c++ 区分大小写。

我不知道为什么你的错误信息,(不同的编译器?),但它应该是:

  error: 'void Abstractclass<Elem>::pop(void)': is abstract

我认为您的链接器说:“未定义的引用...”因此修复编译得很好,但您没有要链接到的定义,例如:

Abstractclass() { }
virtual ~Abstractclass() { }

和:

Queue (int)
    :maxsize( 2 )
{ }
~Queue() { }
virtual void pop( ) { }

注意你必须初始化 maxsize,因为它被声明为常量

(我应该在此处原始发布此内容,因为我无法标记 cmets)

【讨论】:

  • 谢谢!!我设法解决了这个问题。现在,由于某种原因,我收到了这些错误: temp\main.cpp|11|undefined reference to Queue&lt;int&gt;::Queue(int)'| temp\main.cpp|16|undefined reference to Queue::~Queue()'| ||=== 构建失败:2 个错误,0 个警告(0 分钟,3 秒)===|你知道为什么吗??
  • 我认为你的链接器说:'未定义的引用...' 所以修复编译得很好,但你没有要链接到的定义,比如:
  • 我认为你的链接器说:'undefined reference to...' 所以修复编译得很好,但你没有定义要链接,比如: Abstractclass() { } virtual ~Abstractclass() { } Queue (int) :maxsize( 2 ) //:Abstractclass( ) { } ~Queue() { } virtual void pop( ) { } 注意你必须初始化 maxsize 因为它被声明为常量
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 2016-08-22
  • 2021-12-07
  • 2013-03-09
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
相关资源
最近更新 更多