#include "booking.h"
#include <iostream>
booking::booking ( const std::string p_title, const std::string p_notice, const category p_category, const person p_person, const booking::Type p_type, const double p_value ) :
m_type{ p_type },
m_title{ p_title },
m_notice{ p_notice },
m_person{ p_person },
m_category{ p_category },
m_value { p_value }
{
std::cout << "Booking was created" << std::endl; // Debug Message
}
这些是文件(我认为必须知道的一切)
#pragma once
#include <string>
#include "person.h"
#include "category.h"
class booking
{
public:
enum Type { TYPE_REVENUE, TYPE_EXPENDITURE };
booking ( const std::string p_title, const std::string p_notice, const category p_category, const person p_person, const booking::Type p_type, const double p_value ); //Basic Constructor
~booking();
Type GetType ( );
std::string GetTitle ( );
std::string GetNotice ( );
category GetCategory ( );
double GetValue ( );
private:
Type m_type;
std::string m_title;
std::string m_notice;
category m_category;
person m_person;
double m_value;
};
如果我将其中一个类成员(如m_type或double值,无关紧要)转换为const,则会抛出以下错误:
Fehler 1错误C2280:
booking &booking::operator =(const booking &)
:尝试引用已删除的函数C:\ Program Files(x86)\ Microsoft Visual C ++编译器2013年11月CTP \ include \ utility 53
我不明白为什么编译器抱怨复制构造函数,基本上是什么问题。
答案 0 :(得分:3)
您无法(合理地)分配给拥有const
成员的班级的对象。
这就是为什么您收到有关复制赋值运算符的错误的原因。
您没有收到有关复制构造函数的投诉。
在其他新闻中:
在C ++中,所有大写名称都是宏的约定。如果它们被用于其他任何东西(例如常量,如在Java中),则会增加名称冲突和无意中文本替换的风险。除了它是一个眼睛,许多人认为是非常重视。 Java没有预处理器。 C ++确实有一个。
一般来说,传递非基本类型参数作为对const
的引用是个好主意(您只添加了const
)。复制的大型参数还有一些额外的注意事项。在C ++ 11中,这些最好按值传递并移动。
简单&#34; getter&#34;应该声明成员函数const
,以便可以在const
对象上调用它们。
关于受Java启发的Get
前缀,请考虑GetSin(u)+GetCos(v)
与sin(u)+cos(v)
。在Java中,Get
前缀对于使用内省的工具具有一定的价值。 Java有内省。 C ++没有自省。所采用的惯例应更好地适应所使用的语言。
答案 1 :(得分:3)
引用此thread,关于具有const成员的复制构造函数,
复制构造函数的一般形式是
class Foo {
Foo( const Foo& f ) :
mem1( f.mem1 ), mem2( f.mem2 ) /* etc */
{}
};
其中mem1和mem2是Foo的数据成员,可以是const 成员,非const成员,const引用或非const引用。
答案 2 :(得分:2)
当你声明一个const
成员时,编译器不生成默认的赋值运算符(它不知道在赋值期间该成员该怎么做,毕竟它是const ?),你必须自己编写赋值运算符。
注意:强>
答案 3 :(得分:1)
operator=
不是复制构造函数,而是赋值运算符。
const
个对象无法更新,因此在赋值运算符中无法修改对象。
如果您没有声明自己的赋值运算符,编译器会为您生成一个执行成员复制的运算符。但是如果有一个const成员,这不起作用,所以它毕竟不能生成赋值运算符。 (在C ++ 11中,这被称为具有已删除赋值运算符)。
最后,如果您有一些尝试使用赋值运算符的代码,那么您会收到有关尝试使用已删除赋值运算符的错误。一些标准库容器或算法要求赋值运算符存在。您没有显示所有代码但在某处您将尝试执行需要分配的操作。