模板数组类的指针

时间:2014-06-08 19:26:56

标签: c++ templates


我遇到了一段时间以来一直试图解决的问题,根本无法做到。这是场景:
1)我有一个类似于

的模板数组类
//code taken from http://www.learncpp.com, much appreciation for Alex
#ifndef ARRAY_H
#define ARRAY_H 
#include <assert.h> // for assert()
template <typename T>
class Array {
private:
    int m_nLength;
    T *m_ptData;
public:  
    Array() {
        m_nLength = 0;
        m_ptData = 0;
    }
    Array(int nLength) {
        m_ptData= new T[nLength];
        m_nLength = nLength;
    }

    ~Array() {
        delete[] m_ptData;
    }

    void Erase() {
        delete[] m_ptData;
        m_ptData= 0;
        m_nLength = 0;
    }

    T& operator[](int nIndex) {
        assert(nIndex >= 0 && nIndex < m_nLength);
        return m_ptData[nIndex];
    }

    int GetLength() { return m_nLength; }
    friend ostream& operator<<(ostream& out, const Array<T>& n) {
    for(int i=0; i<n.m_nLength; i++) {
            if(i) it << "\n";
            it << n[i];
        }
        return it;
    } 

};

#endif

2)这是我尝试制作数组的类以及我是如何做到的(它有动态内存分配)

class Tune {
    char* artist;
    char* song;
public:
    explicit Tune(const char* a, const char* s) {
        artist = new char [strlen(a)+1]; strcpy(artist, a);
    song = new char [strlen(s)+1]; strcpy(song, s);     
}
...

#include "Array.h"    
void main() {
    Array<Tune> tunes(5);          //Array of 5 elements
}


error C2512: 'Tune' : no appropriate default constructor available
1>          c:\x\x\x\visual studio 2010\projects\x\x\array.h(26) : while
compiling class template member function 'Array<T>::Array(int)'
1>          with
1>          [
1>              T=Tune
1>          ]
1>          c:\x\x\x\visual studio 2010\projects\x\x\main.cpp(10) : see reference to
class template instantiation 'Array<T>' being compiled
1>          with
1>          [
1>              T=Tune
1>          ]

3)然后我记得我可以解决这个问题(不使用我的数组模板类):

void main() {
    Tune **tunes = new Tune*[5];
    ...
}

我想知道这是解决方案,如何使用我的模板数组类创建指针数组,第二个(以免我说覆盖运算符&lt;&lt;),如何打印一个或所有元素数组。
完整的程序是巨大的,这是它的一部分。大多数代码都在评论中,因此问题是孤立的 我很困难,这个项目对我来说意义重大,但我是一个没有经验的程序员,所以我觉得很难处理这样的问题。提前感谢您的帮助。
干杯!

2 个答案:

答案 0 :(得分:1)

首先请显示完整错误消息。其次,不清楚什么是MyType以及它是否具有默认构造函数。

如果MyType是一些算术类型,那么下面的代码将被编译而没有错误。

#include "Array.h"    

int main() {
    Array<MyType> data(5);          //Array of 5 elements
}

至少class Array具有默认构造函数,尽管它没有使用。对于MyType类型,它可以说什么都没有,因为你既没有显示完整的错误消息也没有显示MyType的定义。 我建议检查MyType是否具有默认构造函数。

如果你想创建一个指针数组,那么你应该写

Array<MyType *> data(5);          

至于此代码

void main() {
    MyType **data = new MyType*[5];
    ...
}
然后它与问题没什么共同之处。考虑到main应定义为具有返回类型int。

编辑:如果不考虑Tune类定义中的错误,那么它没有默认构造函数。因此,您应该决定是否要创建Tune类型的对象数组或者指向Tune类型对象的指针数组。我已经展示了如何定义指针数组。或者为Tune类定义默认构造函数。

答案 1 :(得分:0)

  

如何使用我的模板Array类创建指针数组?

如果你的类需要另一种构造元素的方法,你应该创建另一个构造函数,按照你希望的方式初始化它,类似于std::vector的构造函数:

Array( int count, const T& value );

实现这一点的最简单方法是将m_ptData声明为双指针并像这样初始化它:

Array( int count, const T& value ) : m_ptData(new T*[count])
{
    for (int i = 0; i < count; ++i)
    {
        m_ptData[i] = new T(value);
    }
}

最好(也是最困难)的方法是使用 placement-new 来初始化它,std::vector就是这样做的。您可以像这样使用它:

int main()
{
    Array<MyType> data(5, MyType("abc")); // Array of 5 elements,
                                          // all initialized to MyType("abc")
}
  

如何打印数组的一个或所有元素?

应该使用插入器operator<<()来打印整个数组,因此只需打印某些元素就会有点令人困惑维护您的代码。作为替代方案,如果要自定义输出,可以创建流操纵器,或者可以使用成员函数来计算要打印的数字。此外,您的类可以具有begin()end()函数,这些函数返回指向数组开头和结尾的指针,因此类的用户可以自行决定实现打印。在任何一种情况下,都应该使用循环来打印元素。