【问题标题】:abstract classes with generics in c++ / Qtc++ / Qt中具有泛型的抽象类
【发布时间】: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


【解决方案1】:

这段代码:

啊.h

template <typename T>
class A
{
public:
    A(){}

    virtual void f1() = 0;
};

template <typename T>
class B: public A<T>
{
public:
    B(){}

    void f1(){}
};

main.cpp

#include "A.h"
int main ()
{
    A<int> *a = new B<int>();

    a->f1();
}

编译并工作,因为所有模板函数都在头文件中定义。如果要拆分声明和定义,可以使用以下方法之一:

  • 在头文件的底部包含 cpp 文件
  • 在 main.cpp 中包含 cpp 文件

【讨论】:

  • 为什么 A *a = new B(); ?是 B *a = new B();错了吗?
  • 不,A 是 B 的基类,因此您可以创建 B 实例并将其分配给 A 指针。然后就可以使用A接口了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2014-03-08
相关资源
最近更新 更多