我遇到了一段时间以来一直试图解决的问题,根本无法做到。这是场景:
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;),如何打印一个或所有元素数组。
完整的程序是巨大的,这是它的一部分。大多数代码都在评论中,因此问题是孤立的
我很困难,这个项目对我来说意义重大,但我是一个没有经验的程序员,所以我觉得很难处理这样的问题。提前感谢您的帮助。
干杯!
答案 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()
函数,这些函数返回指向数组开头和结尾的指针,因此类的用户可以自行决定实现打印。在任何一种情况下,都应该使用循环来打印元素。