C++ 没有合适的默认构造函数(无参数构造函数)

本来今天吧,想写一个proxy class的范例,写着写着出了个问题,见如下代码

    const int _cap = 10;
    Array1D* _elemArray = new Array1D[_cap];

同时我为Array1D这个类写了一个构造函数来顶替编译器自动生成的

    Array1D(int inx)
    {
        _elemNum = new T[inx];
    }

随后报错,提示没有合适的默认构造函数,但是显然,我这里是提供了一个构造函数的,那么问题就出在现有的构造函数不能应对上面的new语句

联系vector的构造:vector<int>* vec = new vector<int>[20](25); 20是一个vector数组的长度,25是数组中每个vector的长度,则我们可以知道,这里面应该传递了有三种信息:

1.对new分配内存来说,申请内存的对象类型是个vector

2.一共有20个这样的对象

3.25作为这些对象的构造函数的第一个参数传入

那么根据new Array1D[_cap]来看,_cap并不是作为一个参数传递给了Array1D这个类的构造函数,而是作为new函数的一个参数分配内存所用

也就是说,上述的代码可以这样看new(Array1D,_cap,③);

其中的③应该是传递给构造函数的参数

则显然,上面我提供的构造函数必须要有一个参数存在(因为没有使用默认值,事实上这个问题如果给inx一个默认值就不需要提供一个新的无参数构造函数了,不过分离这个问题出来对理解C++的构造函数更有帮助,我觉得使用默认值有点绕开这个问题的意思(逃)),但最上面的代码并没有提供这一参数,故此处实际上是需要一个没有参数的构造函数添加进代码(在此代码中实际上也没需要,空函数体也没问题),之后便通过了编译。

原文地址:https://www.cnblogs.com/HotPants/p/11421065.html

时间: 2024-08-02 05:54:52

C++ 没有合适的默认构造函数(无参数构造函数)的相关文章

C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VM

JavaSE7基础 类中 给出构造方法后,系统默认的无参数构造方法就不能使用

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Test{ public String name; //当我给出了构造方法后,系统默认的无参数构造方法就不能使用了 //要是还想用 无参数构造方法的话,只能自己手动写一个了 //可以通过构造方法 给 成员变量赋值 public Test(String name){ System.out.println("有参数构造方法"); this.name = name; } }

.Net Framework 4.5.1 ASP.NET MVC 5 下新建视图报“错误 运行所选代码生成器时出错 无法检索元数据 没有为该对象定义无参数构造函数”

当在控制器中新建视图的时候,选择的视图界面如下: 执行添加后报如下错误: 错误的内容为: 错误运行所选代码生成器时出错 无法检索"XXX"的元数据没有为该对象定义无参数构造函数 Unable to retrieve metadata for 'XXX'. No parameterless constructor defined for this object. 这个错误一直误导我,以为是模型类的问题,找了半天找不到解决方法,郁闷到死,后来发现是数据上下文的问题. 想到解决方案使用的是D

“T”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法

在创建架构提取公共方法时,发生了这个错误 public class BaseDal<T> where T:class { private readonly SqlSugarClient _db = SqlSugarFatory.GetInstance(); #region 插入方法 /// <summary> /// 插入并返回受影响行数用ExecuteCommand /// </summary> /// <param name="model"

没有为该对象定义无参数的构造函数。

#region 消除未付款订单的流水号 [HttpPost] public JsonResult UnLockCategoryGuidNumber(Bill_Category category1) { } 在为这个JsonResult传递参数的时候遇到了一个错误,服务器返回的是500,报错的信息是没有为该对象定义无参数的构造函数.,一开始我以为是没有写对方法名或者是json字符串里的参数名,又对了对,没有错啊.... 当我把Bill_Category category1放到方法里面的时候,才发现

Storm问题——组件带参数构造函数未被调用,抛出NullpointerException

问题描述 不知道大家有没有遇到过这个问题,我实现了BaseRichBolt,重载一个带参数的构造函数,new这个组件时传入一个参数作为该组件的成员变量,然后在declareOutputFields方法中调用该变量,local模式运行正常,分布式模式运行就抛NPE.后来过了半小时,再提交,又OK了.(PS:其间检查了很多遍代码,没有传入NULL变量) 我在开发trident程序时,继承mapState时也出现了这个问题 可能原因 1.跟storm本身的序列化机制有关系,storm本身对组件进行序列

c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void);//缺省的无参数构造函数 A(const A&a);//缺省的拷贝构造函数 -A();//缺省的析构函数 A&operator=(const A &a);//缺省的赋值构造函数 1).“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘

构造函数与拷贝构造函数

构造函数 构造函数.析构函数与赋值函数是每个类最基本的函数. 对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: 1 A(void): // 缺省的无参数构造函数 2 A(const A &a): // 缺省的拷贝构造函数 3 ~A(void): // 缺省的析构函数 4 A & operate =(const A &a): // 缺省的赋值函数 默认构造函数与默认析构函数仅负责对象的创建和销毁,不做对象的初始化和资源的清理. C++中通过构

C++构造函数和拷贝构造函数详解

构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数). 对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void); // 缺省的无参数构造函数 A(const A &a); // 缺省的拷贝构造函数 ~A(void); // 缺省的析构函数 A & op