C++ 使用另一个类中某个类的构造函数来分配具有新

C++ 使用另一个类中某个类的构造函数来分配具有新,c++,class,constructor,C++,Class,Constructor,我不知道(如果可能的话)如何使用另一个带参数的构造函数从一个具有参数的构造函数的类中分配数组。例如(我将只写实际相关的内容。嗯,我怀疑模板是否相关,但仍然): 模板 C1类{ T*阵列; 公众: C1(内部网络){ 数组=新的T[n]; }; }; C2类{ 整数长度; int lengthArrayC1; C1*阵列; 公众: C2(整数x,整数y){ 长度=x; lengthArrayC1=y; array=//这是我迷路的地方 }; }; 我试着在很多方面写类似的东西: array =

我不知道(如果可能的话)如何使用另一个带参数的构造函数从一个具有参数的构造函数的类中分配数组。例如(我将只写实际相关的内容。嗯,我怀疑模板是否相关,但仍然):

模板
C1类{
T*阵列;
公众:
C1(内部网络){
数组=新的T[n];
};
};
C2类{
整数长度;
int lengthArrayC1;
C1*阵列;
公众:
C2(整数x,整数y){
长度=x;
lengthArrayC1=y;
array=//这是我迷路的地方
};
};
我试着在很多方面写类似的东西:

array = new [length] C1<T> (lengthArrayC1);
array=new[length]C1(lengthArrayC1);
但是没有一个起作用。

做不到:


类型必须具有无参数构造函数才能
new[]
它的数组。但是,请参阅关于使用<代码> STD::vector < /COD>的问题的答案,它允许您指定用于初始化数组元素的原型对象。

*P>*警告,我目前没有C++编译器,因此在我的响应中可能会有一些语法错误。尽管如此,这个想法仍然成立**

更改C1,使其使用部分模板专门化(请注意第二个专门化参数)

模板
C1类{
T*阵列;
公众:
C1(int n=默认大小){
数组=新的T[n];
};
};
。。。然后您可以执行以下操作:

array = new [length] C1<T, lengthArrayC1>;
template <typename T, size_t default_size>
class MyC : public C1
{
public:
   MyC() : C1(default_size){}
};

...

array = new [length] MyC<lengthArrayC1>;
array=new[length]C1;
如果您无法修改C1(因为代码归其他人所有……这种情况时有发生),那么您可以执行以下操作:

array = new [length] C1<T, lengthArrayC1>;
template <typename T, size_t default_size>
class MyC : public C1
{
public:
   MyC() : C1(default_size){}
};

...

array = new [length] MyC<lengthArrayC1>;
模板
MyC类:公共C1
{
公众:
MyC():C1(默认大小){}
};
...
数组=新的[长度]MyC;
仅仅为了做到这一点而创建一个新的类是很难看的,但有时如果我们真的需要您在原始问题中尝试做的事情,这是让事情继续进行的唯一方法


希望能有所帮助。

与您的问题没有直接关系,但请避免使用int。一般来说,大小\u t是此类问题的首选类型。@luis.espinal IMHO这是一个非常糟糕的建议。首先,它建议使用一种类型,这种类型会由于无意中调用模运算(主要是由于混合类型表达式的隐式转换)而引发错误。其次,很少有代码可以扩展到
int
不足以满足某个大小的情况,因此它提供了错误的安全感。第三,更容易打字。如果一个人必须支持庞大的不切实际的数组,那么就使用签名对应的
size\u t
,即
ptrdiff\u t
@cheers-sandhth.-Alf-老实说,这是我第一次听到这样的建议。在我使用C/C++(app或embedded)的任何地方,我们都严格遵循C-Cert的建议,以及到目前为止,人们普遍认为更喜欢大小而不是简单的带符号int。我曾尝试将构造函数的参数添加到模板中,但对于我正在做的事情,我在运行时了解它,并且在编译时需要它。谢谢你的回答。