2014-05-07 47 views
1

我目前正在为FreeCell实现实例化一堆栈卡。每个Array,Stack和Card类都由我创建,Stack和Array类都是模板化的。C++调用嵌套模板实例中的非默认构造函数

Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>>(4); 

运行此代码时,它实例大小为4的数组,如预期,但呼吁栈,这是我需要实例大小13

我尝试了默认的构造函数以下:

Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>(13)>(4) 
Array<StackRA<Card>> * hometemp = new Array<StackRA<Card>13>(4) 

堆栈的默认构造函数如下:

template <typename T> 
StackRA<T>::StackRA() : m_stack() 
{ 
    size = 0; 
} 

还有,我想打电话给

template <typename T> 
StackRA<T>::StackRA(int data) : m_stack(data) 
{ 
    size = data; 
} 

我已经尽我在谷歌的运气,但它一直引导我对资源的模板类模板内的1个参数的构造函数。任何想法都表示赞赏。

编辑:步进到我的程序导致Array构造

template<class T> 
Array<T>::Array(int length, int start_index) 
{ 
    if (length < 0) 
    { 
     cout << "Length cannot be negative, length has been defaulted to 0\n"; 
     m_length = 0; 
    } 
    else 
    { 
     m_length = length; 
     m_start_index = start_index; 
     m_array = new T[length]; 
    } 
} 

的问题,更具体地说,是, “m_array =新T [长度];”调用StackRA的默认构造函数。问题依然存在,如何调用非默认构造函数。在实例化的地方,我会放置我想传入的大小数据吗?

EDIT2:我已经解决了这个问题,使用该种具体实施:

template <typename T> 
StackRA<T>::StackRA() : m_stack() 
{ 
    size = 13; 
} 

回答

0

首先,如果Array代表一个数组,并且意图像一个一样使用,那么您不需要创建一个指针。您可以构建它作为一个自动对象:

Array<StackRA<Card>> hometemp(4); 

现在的问题是,你说的是用下面的代码调用默认构造函数每个元素的数组:

m_array = new T[length]; 

这是真的,将调用默认构造函数,将每个构造函数初始化为T()。此前C++ 11,这是不可能使用不同的构造函数初始化每个元素,但现在你可以使用初始化列表来初始化:

m_array = new T[length] { T(13), T(13), ... }; 

当然,这不会是最好的可变大小的数组(或具有非常大的大小的数组),并不适合我们的目的。相反,你可以按照std::vector行为,并创建另一个构造函数,拷贝对象到阵列中的每个元素:

template <typename T> 
StackRA<T>::StackRA(int size, const T& obj) : size(size), m_stack(/* ... */) 
{ 
    m_array = new T[size]; 
    std::fill(m_array, m_array + size, obj); 
} 

现在构建阵列时,您可以通过正确的构造函数:

Array<StackRA<Card>> hometemp(4, StackRA<Card>(13)); 
+0

最后你必须表示'Array > hometemp(4,StackRA (13));' – iavr

+0

@iavr是的,这是一个错误。感谢您指出。 :) – 0x499602D2

0

有什么特别的你Array,所以你不能使用std::vector?随着std::vector,你就简单的说

std::vector<StackRA<Card>> * hometemp = 
    new std::vector<StackRA<Card>>(4, StackRA<Card>(13)); 

更好,如果大小始终是固定的,使用std::array,例如

std::vector<std::array<Card, 13>> * hometemp = 
    new std::vector<std::array<Card, 13>>(4); 

std::array<std::array<Card, 13>, 4> * hometemp = 
    new std::array<std::array<Card, 13>, 4>(); 

甚至

using Stack = std::array<Card, 13>; 
using Deck = std::array<Stack, 4>; 
Deck *hometemp = new Deck(); 

如果你想添加的功能,你可以简单地封装标准库中的容器到自己的类型。

此外,你可能会重新考虑你的自由存储区,特别是原始指针的使用:

Deck hometemp; 

如果你坚持自己的实现,你可能有一个看std::vector constructors的想法。