gpt4 book ai didi

C++ - 在嵌套模板实例化中调用非默认构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:43 25 4
gpt4 key购买 nike

我目前正在努力为 FreeCell 实现实例化一叠卡片阵列。 Array、Stack 和 Card 类都是我创建的,Stack 和 Array 类是模板化的。

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

当这段代码运行时,它会按预期实例化一个大小为 4 的数组,但会调用 Stack 上的默认构造函数,我需要将其实例化为大小为 13。

我试过以下方法:

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

Stack的默认构造函数如下:

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

以及我要调用的 1 arg 构造函数

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

我在 Google 上试过运气,但它一直引导我找到模板类中模板的资源。任何想法表示赞赏。

编辑:进入我的程序会导致数组构造函数

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 = new T[length];”调用 StackRA 默认构造函数。问题仍然存在,如何调用非默认构造函数。我应该在实例化的什么地方放置我想要传入的大小数据?

EDIT2:我已经为这个特定的实现解决了这个问题:

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

最佳答案

首先,如果 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));

关于C++ - 在嵌套模板实例化中调用非默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com