c++没有合适的默认构造函数可用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++没有合适的默认构造函数可用相关的知识,希望对你有一定的参考价值。
#include <iostream>
#include <string>
using namespace std;
class PersonData
private:
string lastName;
string firstName;
string address;
string city;
string state;
string zip;
string phone;
public:
PersonData(string l, string f)
lastName = l;
firstName = f;
void setName(string l, string f)
lastName = l;
firstName = f;
void printName()
cout << lastName << ',' << firstName << endl;
;
class CustomerData : public PersonData
private:
int customerNumber;
bool mailingList;
;
class preferredCustomer:public CustomerData
private:
double purchasesAmount;
double discountLevel;
public:
preferredCustomer(string l, string f, double p)
purchasesAmount = p;
PersonData::setName(l,f);
void add(double p)
purchasesAmount += p;
void disct()
if (purchasesAmount >= 500 && purchasesAmount < 1000)
discountLevel = 5;
else if (purchasesAmount >= 1000 && purchasesAmount <= 1500)
discountLevel = 6;
else if (purchasesAmount >= 1500 && purchasesAmount < 2000)
discountLevel = 7;
else if (purchasesAmount >= 2000)
discountLevel = 10;
void showdis()
cout << discountLevel << '%' << endl;
;
int main()
double b;
preferredCustomer p("Bee", "Linda", 600);
p.disct();
p.showdis();
while (cin >> b)
p.add(b);
p.disct();
p.showdis();
return 0;
1>d:\documents\visual studio 2008\projects\2222\2222\222.cpp(46) : error C2512: “CustomerData”: 没有合适的默认构造函数可用
private:
int customerNumber;
bool mailingList;
;
这个类是继承PersonData而来,但是基类却不是default constructor,所以要在继承类明确声明构造函数,把基类对象构造
class CustomerData : public PersonData
public:
CustomerData(string s,string f):PersonData(s,f)
private:
int customerNumber;
bool mailingList;
;本回答被提问者和网友采纳 参考技术B preferredCustomer(string l, string f, double p)
purchasesAmount = p;
PersonData::setName(l,f);
应该改为
preferredCustomer(string l, string f, double p) : CustomerData(l,f)
purchasesAmount = p;
//PersonData::setName(l,f);
编译器错误:没有合适的默认构造函数可用
【中文标题】编译器错误:没有合适的默认构造函数可用【英文标题】:Compiler Error: No appropriate default constructor avaible 【发布时间】:2019-10-23 22:17:06 【问题描述】:我是第一次在 C++ 中做 OOP。我注意到它与我过去做过 OOP 的其他语言非常不同。
到目前为止一切都很好,但是我遇到了一个问题,我需要一个构造函数来接收我创建的作为参数的对象,并且由于某些原因它拒绝编译并抛出错误。
我在网上对这个问题进行了深入研究,但我没有看到与我的情况足够相似的案例,而且答案也有很大差异。我想要解决这个问题的正确方法,所以我可以在整个项目中遵循这些约定。
这是引发错误的头文件(Player.h):
#pragma once
// Header files
#include "Square.h"
class Player
private:
// Private variables
Square _position;
public:
// Public constructors declarations
Player(Square position);
// Public functions declaration
void setPosition(Square position);
Square getPosition();
;
这是引发错误的 CPP 文件 (Player.cpp):
// Header files
#include "Player.h"
// Public constructors
Player::Player(Square position) // <---------- ERROR LOCATION
_position = position;
// Public functions
void Player::setPosition(Square position)
_position = position;
Square Player::getPosition()
return _position;
以防万一,这里是参数对象的头文件(Square.h):
#pragma once
class Square
private:
// Private variables
int _x;
int _y;
public:
// Public constructors declarations
Square(int x, int y);
// Public functions declaration
void setX(int x);
int getX();
void setY(int y);
int getY();
;
这里也是参数对象的CPP文件(Square.cpp):
// Header files
#include "Square.h"
// Public constructors
Square::Square(int x, int y)
_x = x;
_y = y;
// Public functions
void Square::setX(int x)
_x = x;
int Square::getX()
return _x;
void Square::setY(int y)
_y = y;
int Square::getY()
return _y;
以下是编译器抛出的错误:
在文件“Player.cpp”的第 4 行:
错误 E0291:类“Square”不存在默认构造函数
错误 C2512: 'Square' : 没有合适的默认构造函数可用
【问题讨论】:
旁注:Player::Player(Square position)
将复制Square
。这不是很多工作,因为它是一对int
s,但是对于较大的对象需要注意。您可能希望 Player::Player(const Square &position)
通过引用传递以节省复制。它被标记为 const 是因为它扩大了您可以传递的内容,并使所有内容都为 const 直到被证明否则有助于防止某些类型的错误潜入。
您可能想观看这个关于现代 C++ 中 OOP 的 cppcon 演讲。特别是使用 override 来标记您的方法可以在您意外重载时避免很多悲伤。 youtube.com/watch?v=32tDTD9UJCE
【参考方案1】:
问题是Player::_position
需要在任何Player
构造函数中的左大括号之前构造。你可以
-
为
Square
创建一个默认构造函数(可以不带参数调用的构造函数)。这可能适合也可能不适合您的计划。
使用初始化列表。如果 Square
由于某种原因不能有默认构造函数,这可以避免设计问题。
初始化列表解决方案如下所示:
Player::Player(Square position)
: _positionposition
【讨论】:
【参考方案2】:看起来默认构造函数被隐式删除了。您可以尝试按如下方式添加一个简单的(在 Square.h 中公开。
Square(): _x(0), _y(0)
~Square()
【讨论】:
【参考方案3】:鉴于您为Square
实现了构造函数,编译器不会实现默认构造函数。您构建 Square 的唯一方法是使用您定义的构造函数。
一旦你声明了Player
的成员变量Square _position
,它应该在Player
的构造函数上以某种方式初始化。但是,编译器不能使用你提供的构造函数。
您可以自己声明默认构造函数,方法是:
Square() = default;
错误代码显示在构造函数的第一行,因为编译器在执行构造函数的主体之前试图初始化Player
的每个成员,但是找不到合适的方式来构造@987654327 @。
另一种解决方案是直接使用您提供的构造函数初始化成员变量。这样,编译器会在初始化Player
的成员变量时使用你的构造函数:
Square _position = Square(0,0)
【讨论】:
以上是关于c++没有合适的默认构造函数可用的主要内容,如果未能解决你的问题,请参考以下文章