【问题标题】:Constructor of a class within a template class模板类中类的构造函数
【发布时间】:2020-12-15 14:22:35
【问题描述】:

创建了一个通用树,尝试将它与一个包含一个 int 值和一个 int 数组的自定义类一起使用。

在尝试以几种不同的方式初始化数组后,似乎都没有进入主函数。 节点类的构造函数:

class ArrNode
{
    int id;
    int* arr;
    int length;
    public:
    ArrNode(int a, int b)
   {
       id = a;
       length = b;
       arr = new int[length]();
   }
    ~ArrNode()
    {
        if(arr != nullptr)
            delete arr;
    }
    int getArrVal(int i) const
    {
        return this->arr[i];
    }
};

模板类:

template <class T>
class AvlTree
{
    private:
    T val;
    AvlTree *left;
    AvlTree *right;
    int height;
    public:
    AvlTree(ArrNode t) : val(t) {}
    T getVal()
    {
        return this->val;
    }

主要功能:

ArrNode t(5,3) //random numbers
AvlTree<ArrNode> a(t);

假设这两个类都有可用的 get 函数,我已经尝试过:

  1. 使用初始化列表
  2. 将构建的节点发送到树中(粘贴在这里的那个)
  3. 发送 int 值并在树构造函数中构建节点

所有这些都在函数范围内工作,但是在返回主函数后,数组没有按预期初始化为零。

注意 - 尽量不要使用任何标准容器

【问题讨论】:

  • ArrNode 有一个指针作为成员,而不是一个数组。使用std::arraystd::vector
  • 嘿,忘了添加我不允许使用任何标准容器,将编辑问题
  • 请在问题中包含您的代码的minimal reproducible example。你发的ArrNode漏掉了一些重要的东西(见3/5规则),这是否只是因为你在这里省略了还不清楚
  • 好吧,我想让它更容易阅读,所以我尽量省略,创建了一个可重现的例子
  • if(arr != nullptr) 在析构函数中是不需要的,但你应该调用delete[]

标签: c++ templates constructor


【解决方案1】:

所以在这里进一步测试和帮助后,错误是没有遵循规则 3,在实现复制赋值运算符后它按预期工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2012-06-11
    相关资源
    最近更新 更多