在构造函数中创建一个字符串数组,并在主函数中使用它

时间:2019-05-21 01:54:55

标签: c++ class

我是哈希的新手,所以我想创建一个包含字符串数组的哈希表。它在类本身中工作,但是当我尝试在类之外使用字符串数组时,它崩溃了。 我的构造函数或我认为的数组有些奇怪。

我从main.cpp中放入代码,并将其粘贴到构造函数中,但它没有任何问题。控制台可以显示我的阵列。但是当我尝试在main.cpp中使用getArray函数时,它就会崩溃。

hashtable.h

class hashtable
{
    public:
        hashtable();
        void remove(string);
        int hashfunction(string str);
        string* getArray();
    private:
         int table_size;
         string* T;
};

hashtable.cpp

hashtable::hashtable()
{
    int table_size = 10;
    elemts_in_array = 0;
    string array[10];

// Im adding some elements to test it. In final Version i will delete the next two lines.
    array[0]="start";
    array[9]="end";

    T = array;

// now I am testing if my function string* getArray() is working, and it's working when i dont use it in main.cpp

    string* arraytest = getArray();
     for (int i=0; i< 10;i++)
     {
         cout << i << " - " << arraytest[i]<< endl;
     }
}


/////////// getArray function
string* hashtable::getArray()
{
    return T;
}

main.cpp

int main()
{
    hashtable table;
    string* array = table.getArray();
    for (int i=0; i< 10;i++)
    {
        cout << i << " - " << array[i]<< endl;
    }
    return 1;
}

当我只创建一个称为哈希表的对象时,它的工作没有任何问题,但是当我创建一个对象时,我想将数组通过我的getArray函数传递给main.cpp,它崩溃了,我真的不知道为什么。 / p>

1 个答案:

答案 0 :(得分:0)

arrayhashtable的构造函数的末尾超出范围,而使T指向无效的内存。如果希望T指向的数组在hashtable的构造函数范围之外继续存在,则需要动态分配。或者更好的方法是使用std::vector<std::string>

class hashtable
{
    public:
        hashtable()
            : T{10}
        {
            T[0] = "start";
            T[T.size() - 1] = "end";

            for (int i = 0; i < T.size(); ++i)
            {
                std::cout << i << " - " << T[i] << '\n';
            }
        }

        std::vector<std::string>& getArray()
        {
            return T;
        }

        void remove(std::string);
        int hashfunction(std::string str);

    private:
        std::vector<std::string> T;
};

int main()
{
    hashtable table;
    std::vector<std::string>& array = table.getArray();
    for (int i = 0; i < array.size(); ++i)
    {
        std::cout << i << " - " << array[i] << '\n';
    }
}

Live Demo