【发布时间】:2014-08-08 12:34:20
【问题描述】:
当我运行以下代码并按下回车按钮时,我得到一个分段错误。 我在互联网上到处搜索,但找不到问题所在。我对 C++/Qt 很陌生。
基类:
stack.h
#ifndef STACK_H
#define STACK_H
template <class T> class stack
{
public:
stack();
virtual T pop() = 0;
virtual void push(T i) = 0;
};
#endif // STACK_H
stack.cpp
#include "stack.h"
template<class T> stack<T>::stack()
{
}
arraystack.h
#ifndef ARRAYSTACK_H
#define ARRAYSTACK_H
#include "stack.h"
template <class T> class arraystack : public stack<T>
{
public:
arraystack();
T pop();
void push(T i);
};
#endif // ARRAYSTACK_H
arraystack.cpp
#include "arraystack.h"
#include <QDebug>
template<class T> arraystack<T>::arraystack()
{
}
template<class T> T arraystack<T>::pop(){
qDebug() << "popping bad";
}
template<class T> void arraystack<T>::push(T i){
qDebug() << "pushing shit";
}
调用pop-Function的部分:
计算器.h
// ...
private:
Ui::calculator *ui;
arraystack<int> *h;
bool integer;
// ...
计算器.cpp
// ...
void calculator::on_b_enter_clicked()
{
h->pop();
}
// ...
错误:
下级停止,因为它收到了来自操作系统的信号
信号名称:SIGSEGV
信号含义:Segmentation Fault
【问题讨论】:
-
我很惊讶它可以编译,因为您已经在源文件中定义了头文件。但如果它以某种方式发生了,那么也许你没有正确初始化
h。或者可能你已经以某种方式破坏了它的价值。使用调试器检查它是否指向有效对象。 -
您能否显示代码部分,您实际创建对象的位置(使用
new等)? -
(抱歉,我的意思是“在源文件中定义了模板”。现在纠正它为时已晚。)
-
@MatthiasB 我尝试使用 new 关键字.. 但它给出了错误:未定义的对 'arraystack
::arraystack()` 的引用。还有@mike,你在哪里看到我在源文件中定义了标题? -
好的,我尝试在头文件中定义模板。没有成功。你能在答案中给出正确的例子吗?
标签: c++ qt generics abstract-class