【问题标题】:Call constructor inside another constructor (no matching function to call...) c++在另一个构造函数中调用构造函数(没有匹配的函数可以调用......)c ++
【发布时间】:2013-11-07 20:33:59
【问题描述】:

我编写了一个 Array 类来创建 1d、2d 和 3d 数组,它适用于每个测试:2d 案例的数组类构造函数示例:

Array::Array( int xSize, int ySize )
{ 
xSize_ = xSize;
ySize_ = ySize;
zSize_ = 1;
vec.resize(xSize*ySize);
}

它工作正常,但是当我需要在其他构造函数中使用这个构造函数时,我得到“没有匹配的函数错误”, 我的部分代码:

class StaggeredGrid
{
public:
StaggeredGrid ( int xSize1, int ySize1, real dx, real dy ) : p_ (2,2) {}
protected:
Array p_;

完全错误:

No matching function for call to Array::Array() 
Candidates are : Array::Array(int)
Array::Array(int, int)
Array::Array(int, int, int)

如果有人知道问题,我将不胜感激

【问题讨论】:

  • 这应该在 C++ 中工作。错误出现在您没有向我们展示的源文件的一部分中。请复制完整的源文件 (sscce.org) 并在错误消息中包含行号。
  • 您可能应该使 Array *p_ 而不是 Array p_ (使其成为指针),然后在 StaggeredGrid 构造函数中执行 new 或 unique_ptr 或类似的操作。
  • @RichardChambers 请不要推荐使用指针

标签: c++ arrays constructor


【解决方案1】:

您的 Array 类具有三个构造函数,分别采用一个、两个和三个整数。如果 StaggeringGrid 有一个默认构造函数,它将调用 Array::Array(),根据您所说的,它不存在。

【讨论】:

  • 感谢您的建议,添加另一个没有参数的构造函数,解决了问题。但我很好奇为什么会发生这种情况以及为什么我的二维数组构造函数没有加载! (通过 addign array() ,现在 array(x,x) 已加载!!)
【解决方案2】:

问题是你在 StaggeredGrid 的构造函数中声明而不初始化

    Array p_;

应该调用默认构造函数,您的代码中似乎缺少该构造函数。

简单的添加空的默认构造函数应该可以解决问题。

    class Array
    {
    public:
        Array(){}
        // ...
    };

【讨论】:

  • 你只是在猜测
  • “没有匹配的函数调用 Array::Array()”是默认构造函数缺失的明确标志。
  • 默认构造函数的问题是 OP 希望在构造 StaggeredGrid 时指定大小,因此默认不会这样做。
  • 问题不是缺少Array中的默认构造函数,而是没有在StaggeredGrid构造函数之一中初始化p_
  • @Erbureth:谢谢,已更正。当然,这就是我想说的。对不起。
【解决方案3】:

一旦你在一个类中定义了任何构造函数,编译器就不会为你的类隐式定义默认构造函数。

在您的情况下,您已经定义了参数化构造函数“Array(int xSize, int ySize)”,但是您正在使用默认构造函数创建一个类,即 Array p_。这会调用您的编译器未完全找到的默认构造函数。

解决方案:

Array类中引入一个默认构造函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2011-03-24
    • 2010-09-23
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多