如何在 for 循环中调用参数化构造函数。

Posted

技术标签:

【中文标题】如何在 for 循环中调用参数化构造函数。【英文标题】:How can I call a parameterized constructor inside a for loop. 【发布时间】:2016-02-12 14:30:18 【问题描述】:

我创建了一个 parameterizd 构造函数区域。我使用 area 来初始化对角点。在 int main 部分,我无法调用构造函数。请更正我的代码并解释错误:

int main()

 int ab,p,q,r,s,l,m,n,o;
  cout<<"Enter the number of rectangles: ";
  cin>>ab;

  for (int i=0; i<ab; i++)
   
     cout<<"For rectangle "<<i+1<<endl;
     cout<<"Enter the starting and ending values of the 1st diagonal: ";
     cin>>p>>q>>r>>s;
     cout<<"Enter the starting and ending values of the 2nd diagonal: ";
     cin>>l>>m>>n>>o;
     area obj[i](p,q,r,s,l,m,n,o);
     obj[i].findArea();
     obj[i].display();
    
  return 0;

【问题讨论】:

删除所有出现的“[i]”,它就会起作用。 无关:将“区域”作为一种对象有点奇怪。如果该类表示一个矩形,则称其为“矩形”。 【参考方案1】:

随便写吧:)

 area obj(p,q,r,s,l,m,n,o);
 obj.findArea();
 obj.display();

至于声明

area obj[i](p,q,r,s,l,m,n,o);

那么您可能不会以这种方式初始化数组。在循环中定义数组是没有意义的。

【讨论】:

【参考方案2】:

假设数组obj 应该在循环外使用,我建议使用std::vector 代替,在循环之前声明。那么你有两种选择:

    声明向量和reserve足够的内存(这样添加新元素时不必重新分配数据),然后调用emplace_back添加新元素。

    std::vector<area> obj;
    obj.reserve(ab);
    for (int i=0; i<ab; i++)
    
        ...
        obj.emplace_back(p,q,r,s,l,m,n,o);
    
    

    用正确的大小声明向量 (ab) 并默认构造所有元素,然后使用简单的赋值将实际对象复制到适当的位置。这要求area 可以是默认构造的,并且可能是复制赋值或移动赋值运算符。

    std::vector<area> objab;
    for (int i=0; i<ab; i++)
    
        ...
        obj[i] = area(p,q,r,s,l,m,n,o);
    
    

如果您想要一个数组(或向量),并且循环中的每个对象都应该只存在于循环中,并且在循环之后不需要使用任何内容,只需声明该对象使用正确的构造函数参数:请参阅the answer from Vlad from Moscow 了解如何执行此操作。

【讨论】:

以上是关于如何在 for 循环中调用参数化构造函数。的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中调用基类的参数化构造函数?

在继承 C++ 中调用 main 中的参数化构造函数

如何在 Dart 中调用超级构造函数?

c++ 如何在构造函数中启动一个线程,从命名管道读取数据?

为啥我不能在 C++ 中用 new 调用参数化构造函数?

使用 COM 的参数化构造函数实例化类