如何正确制作带有模板数组的类对象?

Posted

技术标签:

【中文标题】如何正确制作带有模板数组的类对象?【英文标题】:How do I make a class object with templetad array properly? 【发布时间】:2019-07-16 17:01:57 【问题描述】:

所以我在文件 Node.h 中编写了一个类“Node”作为树数据容器。它包含一个二维数组,其大小在编译时给出,但我只能从不同的类中获取它,而不是硬类型它。我试过了

class Node 
    private:
        int array[size][size];

只有我自己

error: ‘fFieldSize’ was not declared in this scope

因此,我做了这样的事情:

template<int T,int Z>
class Node 
    private:
        int array[T][Z];

现在,我将这个文件包含在我想要的“引擎”类中

    使用节点实例

    使用返回类型Node的“Engine”的成员函数

    1. node<size,size> firstnode;
    2. Node GetData();
    

引擎有一个 .h 和一个 .cxx 文件。 我不知道如何用成员函数来做这件事。

我试过了

Node<size,size> GetData;

但我得到了错误:

error: invalid use of non-static data member ‘MyNAMESPACE::Engine::size’

我们将不胜感激。另外,这是我的第一个问题,我希望我所做的一切都符合标准。

【问题讨论】:

如果您真的想要这样做并且在编译时知道大小,那么您的设置与something like this 有何不同?使用您的问题代码的minimal reproducible example 更新您的问题,我们可以复制/粘贴/编译以产生您的错误,这将很有帮助。 您的大小变量必须是 constexpr 或字面量。 【参考方案1】:

size 必须是 constconstexpr,因为模板参数必须在编译时知道。

否则需要动态收集,例如:

class Node 
    public:
        Node(int T,int Z) : array(T,std::vector<int>(Z,0))
        

    private:
        vector<vector<int>> array;

【讨论】:

我尝试将 const int size 设为 Engine 的成员变量,但还是不行。至于向量,我的头数组更快/更小,大小和速度都是我使用的一个问题。否则,我没有全部情况,因为 std::vec 可以在不设置大小的情况下声明,对吧? 我很难相信刚开始接触 C++ 的人会知道向量与数组相比有多快或多慢。我的建议是放弃你的先入为主的观念,使用 std::vector<:vector>>. 你说得对,我对实际的速度差异知之甚少,但我知道我的任务有 1 秒的有限时间,并且必须进行尽可能多的计算。具体来说,我尝试实现蒙特卡洛树搜索。 如果您一心想要使用数组,请使用动态分配。在您的构造函数中传递大小,使您的数组为 int** 类型并使用 new int*[count] 分配,在循环中分配每个元素。 一个向量将被优化得如此之快,以至于你甚至看不出有没有它的区别。

以上是关于如何正确制作带有模板数组的类对象?的主要内容,如果未能解决你的问题,请参考以下文章

访问包含在数组中的指向类对象的类成员函数的正确语法是啥?

如何反序列化具有可序列化对象数组的类

智能指针类模板

使用带有模板参数的成员函数指针

Qt 应用程序在退出时崩溃

C# |如何制作用于将数据从 DAL 传递到 BLL 的类实例(对象)