使用类模板时在堆上创建对象

Posted

技术标签:

【中文标题】使用类模板时在堆上创建对象【英文标题】:Create object on heap when using class templates 【发布时间】:2019-09-29 21:46:35 【问题描述】:

我想这样做:

Array<int>* arr = new Array();

但我不断收到错误消息:“数组”类的参数列表丢失。 不可能在堆上创建它吗?我还没有看到任何似乎可以做到这一点的代码。

我也尝试了另一种使用代码的方式:

Array<int>* arr;

然后尝试打印数组的内容,但它给了我它尚未实例化的错误。如果我不能在堆上创建它,我想如何动态地实例化它。毕竟,我不知道用户想要在其中放入什么。

这是我所有的代码:

Array.h

#ifndef _ARRAY_H_
#define _ARRAY_H_

#include <cstring>          // for size_t definition

/**
 * @class Array
 *
 * Basic implementation of a standard array class for chars.
 */
template <typename T>
class Array 

    public:
        /// Type definition of the element type.
        typedef T type;

        /// Default constructor.
        Array (void);


    private:
        /// Pointer to the actual data.
        T* data_;

        /// Current size of the array.
        size_t cur_size_;

        /// Maximum size of the array.
        size_t max_size_;
;

#include "Array.inl"
//#include "Array.cpp"

#endif   // !defined _ARRAY_H_

Array.cpp

#include <stdexcept>         // for std::out_of_bounds exception
#include <iostream>
#include "Array.h"

#define MAX_SIZE_ 20

//
// Array
// Default Constructor 
template <typename T>
Array <T>::Array (void)
    :data_(new T[MAX_SIZE_]),
    cur_size_(0),
    max_size_(MAX_SIZE_)
   

Array.inl

//
// size
//
template <typename T>
inline
size_t Array <T>::size(void) const

    return this->cur_size_;


//
// max_size
//
template <typename T>
inline
size_t Array <T>::max_size(void) const

    return this->max_size_;

driver.cpp

#include <iostream>
//#include "Array_Base.h"
#include "Array.h"

int main(void)

    Array<int>* arr = new Array();
    std::cout << "Max size of array is: " << arr->max_size() << std::endl;


【问题讨论】:

投票结束是一个错字。 Array&lt;int&gt;* arr = new Array(); 应该是 Array&lt;int&gt;* arr = new Array&lt;int&gt;(); 或者更简单的 auto arr = new Array&lt;int&gt;(); #define _ARRAY_H_ 这是一个保留的标识符。通过定义它,您的程序将具有未定义的行为。您应该使用另一个标头保护。 为什么不直接使用Array&lt;int&gt; arr; 【参考方案1】:

因为类是一个模板类,只是Array 不是一个完整的类型。您需要包含模板类型。最后也不需要空括号。

Array<int>* arr = new Array<int>;

【讨论】:

我们还需要大小,即 Array* arr new = Array; @UnSat 我正在查看类定义,并且只有一个模板参数。也许它需要第二个,但这不是问题的一部分。

以上是关于使用类模板时在堆上创建对象的主要内容,如果未能解决你的问题,请参考以下文章

特殊类设计

特殊类设计,单例模式

当由另一个在堆上分配的对象创建时,对象在哪里分配? [复制]

C++:在堆上创建对象,还是在栈上?

在堆上分配的对象

特殊类设计