【问题标题】:How to make a template class a data member of another class?如何使模板类成为另一个类的数据成员?
【发布时间】:2014-05-23 04:47:45
【问题描述】:

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

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

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.cpp

#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)

我尝试用于此类的代码 sn-p 是:

    //Check if Class Works
    letter_frequencies array;

    array.outputFrequencies();

现在,darray 工作得很好,程序完全按照我的需要做,但其中一个要求是有一个名为 letter_frequency 的类,其数据成员为 darray&lt;structTypename&gt; 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

【问题讨论】:

  • 我敢说darray 没有相应地初始化/调整大小。您的 letter_frequencies 类的构造函数是空的,不久之后您将访问 darray。也许如果你发布darray.h 来源?
  • @Massa 对,抱歉,刚刚添加。

标签: c++ class templates g++ member


【解决方案1】:

正如我之前提到的,您必须像这样创建 letter_frequencies 构造函数:

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

(所以你用必要数量的元素初始化数组)。

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

【讨论】:

  • 太棒了!非常感谢!是的,我会使用向量,但不幸的是,我的教授认为我们需要从里到外学习数据结构,然后才能使用 cstdlib 中的数据结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多