如何使模板类成为另一个类的数据成员

How to make a template class a data member of another class?

本文关键字:另一个 数据成员 何使模      更新时间:2023-10-16

所以我要做的是编写一个以模板类为数据成员的类。这是我家庭作业的一部分。

到目前为止,这就是我所拥有的:

letter_frequencies.h

#include "ltr_freq_pair.h"
#include "darray.h"
class letter_frequencies
{
    private:
        darray<letterFrequencyStruct> array;
    public:
        letter_frequencies();
        void outputFrequencies();
};

letter_frequencies.pp

#include <iostream>
#include "letter_frequencies.h"
letter_frequencies::letter_frequencies()
{}
void letter_frequencies::outputFrequencies()
{
    for(int index = 0; index < 26; index ++)
    {
        std::cout << "n" << array[index].letter;
        std::cout << " " << array[index].frequency;
    }
}

一切都可以编译,但一旦我运行程序,它就会出现以下错误:

a.out: darray.cpp:44: T& darray<T>::operator[](unsigned int) [with T = letterFrequencyStruct]: Assertion 'index < used' failed. Abort (core dumped)

我试图为这个类使用的代码片段是:

    //Check if Class Works
    letter_frequencies array;
    array.outputFrequencies();

现在,darray工作得很好,程序正是我需要它做的事情,但其中一个要求是有一个名为letter_frequency的类和一个数据成员darray<structTypename> name,这就是为什么我首先要处理这个问题。

此外,我将如何使类调用darray的显式构造函数?我想把尺寸定为26号。

darray.h

#ifndef DARRAY_H
#define DARRAY_H
#include <iostream>
template <typename T>
class darray
{
    public:
        //Constructors
        darray();
        darray(const darray&);
        explicit darray(unsigned);
        //Destructor
        ~darray();
        //Constant Members
        unsigned size() const {return used;}
        unsigned capacity() const {return cap;}
        //Modification Members
        T& operator [] (unsigned);
        void pop_back();
        void push_back(const T&);
        const T* find(const T&) const;
        void resize(unsigned);
        //Operators
        T& operator = (const darray&);
        bool operator == (const darray&) const;
        //Friends
        template <typename X>
        friend std::ostream& operator << (std::ostream& output, const darray<X>& array);
    private:
        T* arr;
        unsigned used, cap;
};
template <typename X>
std::ostream& operator << (std::ostream& output, const darray<X>& array)
{
    for(int index = 0; index < array.size; index++)
    {
        output << index << array[index];
    }
    return output;
}
#include "darray.cpp"
#endif

正如我之前提到的,您必须使letter_frequencies构造函数如下所示:

letter_frequencies::letter_frequencies() : array(26) {
}

(因此,您可以使用必要数量的元素初始化数组)。

但是:我认为你不应该自己制作array,而std::vector会更好。。。