您现在的位置是:首页 > 正文

重定义默认参数&&表达式必须包含类类型:解决方案

2024-02-29 12:53:13阅读 1

重定义默认参数&&表达式必须包含类类型:解决方案

关于重定义默认参数一般出现在类的重载上(即对相同函数名,但是参数列表不同)。

问题代码如下:
Myclass.h文件

class MyClass
{
public:
    MyClass();
    MyClass(int a=0, int b=0);
    void Print();
private:
    int x, y;
};

Myclass.cpp文件

#include "Myclass.h"
#include <iostream>
using namespace std;

MyClass::MyClass()
{
	x = 0;
	y = 0;
}

MyClass::MyClass(int a=0, int b=0)`
{
	x = a;
	y = b;
}

void MyClass::Print()
{
	cout << "x= " << x << endl;
	cout << "y= " << y << endl;
}

mian.cpp文件

int main()
{
	MyClass obj1();   
	MyClass obj2(5, 8);
	obj1.Print();
	obj2.Print();
	return 0;
}

运行此main.cpp文件会出现:E0153 表达式必须包含类类型
原因在于,编译器会把Myclass obj1()当作声明一个函数来处理,也就是obj1是一个函数名,并不是你想要使用默认无参构造想构造出的对象。
解决办法:Myclass obj1;就会使用默认无参构造。

但是这样也会出现另一个错误,对于obj1会出现:
E0339 类 “MyClass” 包含多个默认构造函数 Myclass

这个错误是由于存在一个默认参数构造函数,即

MyClass(int a=0, int b=0);

编译器不知道调用哪个函数来初始化它。

解决方案:去掉Myclass.h中形参列表中的赋值操作,只保留在Myclass.cpp中对形参的赋值如下:

MyClass(int a, int b);
MyClass::MyClass(int a=0, int b=0)`
{
	x = a;
	y = b;
}

正确代码:

class MyClass
{
public:
    MyClass();
    MyClass(int a, int b);
    void Print();
private:
    int x, y;
};
#include "Myclass.h"
#include <iostream>
using namespace std;

MyClass::MyClass()
{
	x = 0;
	y = 0;
}

MyClass::MyClass(int a=0, int b=0)`
{
	x = a;
	y = b;
}

void MyClass::Print()
{
	cout << "x= " << x << endl;
	cout << "y= " << y << endl;
}
int main()
{
	MyClass obj1();   
	MyClass obj2(5, 8);
	obj1.Print();
	obj2.Print();
	return 0;
}

运行截图:
在这里插入图片描述

网站文章

  • 洛谷P1443 马的遍历——标准广度优先搜索

    洛谷P1443 马的遍历——标准广度优先搜索

    Solution: 这是一道标准的广度优先搜索题目。我们知道,马在棋盘上是按“日”行走的,也就是有八个方向,我们沿着这八个方向广度优先搜索就可以了。 代码如下: #include #include #include #define MAX 500 using namespace std; int mp[MA...

    2024-02-29 12:53:07
  • C#中的ArrayList类详解 最新发布

    一、ArrayList类定义ArrayList类相当于一种高级的动态数组,它是Array类的升级版本。ArrayList类位于System.Collections命名空间下,它可以动态地添加和删除元素...

    2024-02-29 12:52:37
  • 逍遥模拟器怎样连接android,逍遥安卓模拟器

    逍遥模拟器怎样连接android,逍遥安卓模拟器

    逍遥安卓模拟器是一款非常出众的安装模拟器应用,其为用户提供了完善的安卓模拟环境,能够支持用户在模拟器上安装目前绝大部分的安卓应用程序,而且具备了流畅、稳定等诸多特点,与此同时,其还为用户提供了鼠标键盘...

    2024-02-29 12:52:31
  • 计算机网络笔记之物理层

    计算机网络笔记之物理层

    卫星的通信频带宽,通信容量大;卫星的通信距离远,且通信费用与通信距离无关;但卫星的通信时延较大,保密性较差。通信容量大,传输损耗小,抗干扰好,保密性好,体积小。但施工时难于将两根光纤精确连接。比如四进制码元,在电平中有四种波形,用两个比特来表示一个码元。有线传输介质主要有同轴电缆、双绞线和光缆。波特率就是每秒传输码元的个数。多个光纤就可以捆成一个光缆。计算机网络 第八版 谢希仁。

    2024-02-29 12:52:25
  • flowable节点任务完成后使用脚本获取节点表单控件值

    flowable节点任务完成后使用脚本获取节点表单控件值

    节点完成后有两个方法获取到节点表单的控件值,一个是在节点加任务监听器,一个是用脚本,然后加全局任务监听器。任务监听器:@Slf4jpublic class LYOverListener impleme...

    2024-02-29 12:52:19
  • 一日一码06——堆排序

    这个堆排序算法,采用的是最大堆;最小堆,通常在构造最小优先队列时使用。//堆排序 2013/09/29#include #include #include #include int heapSize = 0;void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}int left(int

    2024-02-29 12:51:48
  • vue组件间的通讯的10种方法

    vue组件间的通讯的10种方法

    1.props/$emitprops主要用于父组件传递数据给子组件,父==>子。Vue自定义事件父组件可以在使用子组件的地方直接用 v-on来监听子组件触发的事件 。即父组件中使用 v-on绑定自定义...

    2024-02-29 12:51:41
  • css3实现图片的轮播

    利用css3中的@keyframes可以轻松实现图片的轮播和巧妙的使图片轮播到该图片后进行暂停展示.

    2024-02-29 12:51:34
  • mybatis中@Results,@ResultMap注解使用

    mybatis中@Results,@ResultMap注解使用

    ResultMap注解的使用,

    2024-02-29 12:51:03
  • Mybatis详解(配置详解、源码解读、一级缓存二级缓存原理)

    Mybatis详解(配置详解、源码解读、一级缓存二级缓存原理)

    mybatis各个配置有什么意义?在代码中如何影响运行?一级缓存二级缓存具体怎么实现的?本文带大家从源码理解。

    2024-02-29 12:50:54