自创建模板矩阵类的问题



我正在尝试编写代码,为具有边界检查和其他运算符的矩阵提供模板。但是,我现在被困在SIGGSEGV上。该矩阵也基于我自己编写的向量类:

#ifndef VEKTOR_H
#define VEKTOR_H
#include "Exeptions.h"
template<typename T>
class vektor
{  
    private:
        unsigned int length;
        T* items;
    public:
        inline unsigned int getLength() const{return length;};
        vektor():length(0),items(nullptr)
        {
            //ctor
        }
        virtual ~vektor()
        {
            delete [] items;
        }
        vektor(const vektor& other):length(other.getLength()),items(new T[length])
        {
            for(int i = 0;i<length;i++)
            {
                items[i]=other[i];
            }
        }
        vektor(int len):length(len),items(new T[len])
        {
        }
        vektor<T>& operator=(const vektor& rhs)
        {
            if (this == &rhs) return *this; // handle self assignment
            //assignment operator
            length = rhs.getLength();
            items = new T[length];
            for(int i = 0;i<length;i++)
            {
                items[i]=rhs[i];
            }
            return *this;
        }
        T& operator[](const unsigned int index)const
        {
            if(index >= 0 && index < length)
            {
                return items[index];
            }
            else throw out_of_bounds();
        }
};
#endif // VEKTOR_H

然后是矩阵的代码:

#ifndef MATRIX_H
#define MATRIX_H
#include "vektor.h"
template <typename T>
class matrix
{
    private:
        int columns;
        vektor<T>* tabs;
    public:
        inline int getColCount()const{return columns;};
        inline int getRowCount()const{return tabs[0].getLength();};
        inline vektor<T>* getTabs()const{return tabs;};
        matrix():columns(0),tabs(new vektor<T>(0))
        {
            //ctor
        }
        matrix(int columns, int rows):columns(columns),tabs(new vektor<T>[columns])
        {
            for(int i = 0; i< columns;i++)
            {
                tabs[i] = *new vektor<T>(rows);
            }
        }
        virtual ~matrix()
        {
            delete tabs;
        }
        matrix(const matrix& other):rows(other.getColCount()),tabs(new vektor<T>(*other.getTabs()))
        {
            //copy ctor
        }
        matrix<T>& operator=(const matrix& rhs)
        {
            if (this == &rhs) return *this; // handle self assignment
            //assignment operator
            spalten = rhs.getColCount();
            tabs = new vektor<T>(*rhs.getTabs());
            return *this;
        }
        vektor<T>& operator[](unsigned int index)
        {
            return tabs[index];
        }
};
#endif // MATRIX_H

一个包装类,它实例化带有字符串的矩阵以创建类似菜单的结构:

MenUI::MenUI():selectedTab(3),selectedItem(4),menItems(matrix<string>(3,4))
{
    menItems[0][0] = "File";
    menItems[0][1] = "Edit";
    menItems[0][2] = "View";
    menItems[0][3] = "Search";
    menItems[1][0] = "New";
    menItems[1][1] = "Undo";
    menItems[1][2] = "Perspectives";
    menItems[1][3] = "Find";
    menItems[2][0] = "Open...";
    menItems[2][1] = "Redo";
    menItems[2][2] = "Toolbars";
    menItems[2][3] = "Find in Files";
}

在这里,SIGSEGV 发生在第 tmp = menItems[selectedTab][i];

void MenUI::print()
{
    int offset = 0;
    string tmp;
    for(unsigned int i = 0; i<menItems.getColCount();i++)
    {
        tmp = menItems[i][0];
        if (i == selectedTab) cout  << "|- " << setw(10) << tmp << " -";
        else cout << "|  " << setw(10) << tmp << "  ";
    }
    cout << "|" << endl;
    offset = selectedTab * (10 + 5);
    for(unsigned int i = 1;i<menItems.getRowCount();i++)
    {
        tmp = menItems[selectedTab][i];
        if(i == selectedItem) cout << string(offset-3, ' ') << "|> " << setw(10) << tmp << " <|" << endl;
        else cout << string(offset-3, ' ') << "|  " << setw(10) << tmp << "  |" << endl;
    }
}

由于这是我第一次使用模板,我现在有点迷茫。我正在使用代码::块IDE与GCC。如果有人能为我指出正确的方向,那就太好了。谢谢!

如果selectedTab是3并且你这样做tmp = menItems[selectedTab][i];你的代码将出现错误,因为你正在内存边界之外访问。

我可能把你写的东西看得太字面了,你改变了selectedTab

相关内容

  • 没有找到相关文章