C ++参数化构造函数错误

时间:2014-12-18 06:26:35

标签: c++ class constructor

我正在使用参数化构造函数编写用于创建简单C ++类的代码。我的代码如下:

#include <iostream>
using namespace std;

    class CC{
    public:
      double h[];
      double t[];
      int tsize;

      CC(double rs[], double ts[], int l){
        for (int k = 0;k < l;k++){
         t[k] = ts[k];
         h[k] = rs[k];
         };
        tsize = l;
      };
    };

    int main(int argc, char const *argv[])
    {
        double r[] = {1,4,9};
        double tm[] = {1,2,3};
        int s = 3;
        CC CC1(r,tm,s);
        cout<<CC1.h[0]<<CC1.h[1]<<CC1.h[2]<<endl;
        cout<<CC1.t[0]<<CC1.t[1]<<CC1.t[2]<<endl;
    };

它输出为:

149
149

然而它应该是

149
123

有人可以告诉我,我在这里做错了吗?

1 个答案:

答案 0 :(得分:3)

在类定义中,double h[];是一个错误。您必须将数组的边界指定为类定义的一部分,例如:

double h[5];

然后在您的构造函数中检查您是否收到l > 5。 (顺便说一句,不要使用l作为变量名,它看起来太像1)。您的编译器应该给出错误。

如果您在编译时不知道制作阵列有多大,那么就不能使用C风格的数组。而是使用C ++风格的数组;那些被称为向量:

vector<double> h, t;

由于可以通过传递一对绑定初始数据的指针来初始化向量,因此可以像这样编写构造函数:

CC(double rs[], double ts[], int length)
    : h(rs, rs+length), t(ts, ts+length), tsize(length) 
{ }

额外奖励:如果您传递实际数组(不是指针),可以从传入的数组中推断出长度:

template<size_t length>
CC(double (&rs)[length], double (&ts)[length])
    : h(rs, rs+length), t(ts, ts+length), tsize(length)
{ }

用法:

CC cc1(r, tm);

除了其他构造函数之外,您可以使用此构造函数。

相关问题