#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 或双精度值,哪个都无关紧要(放入 const,它会抛出以下错误:
Fehler 1 错误 C2280:
booking &booking::operator =(const booking &)
:尝试引用已删除的函数 C:\程序文件 (x86(\Microsoft Visual C++ 编译器 2013 年 11 月 CTP\include\实用程序 53
我不明白为什么编译器抱怨复制构造函数以及基本上是怎么回事。
您不能(合理地(分配给具有const
成员的类的对象。
这就是您收到有关复制赋值运算符的错误的原因。
您不会收到有关复制构造函数的投诉。
在其他新闻中:
-
在C++所有大写名称都是宏的约定。如果它们用于其他任何用途(例如常量,如在 Java 中(,那么会增加名称冲突和无意文本替换的风险。此外,这是一个碍眼的东西,被许多人解读为额外的强调。Java没有预处理器。C++确实有一个。
通常传递 非基本类型的参数作为对
const
的引用是个好主意(您只添加了const
(。对于复制的大型参数,有一些额外的注意事项。在 C++11 中,最好按值传递这些内容并移动。简单的"getter"成员函数应该
const
声明,以便可以在const
对象上调用它们。
关于受 Java 启发的Get
前缀,请考虑 GetSin(u)+GetCos(v)
与 sin(u)+cos(v)
。在 Java 中,Get
前缀对于使用内省的工具具有一些价值。Java有内省。C++没有内省。所采用的公约应更好地适应所使用的语言。
当你声明一个const
成员时,编译器不会生成一个默认的赋值运算符(它不知道在赋值过程中如何处理这个成员,毕竟它是常量?(,你必须自己编写赋值运算符。
注意:
- 通过引用将参数传递给 const。
operator=
不是复制构造函数,而是赋值运算符。
const
对象无法更新,因此在赋值运算符中无法修改对象。
如果不声明自己的赋值运算符,编译器会为您生成一个按成员复制的赋值运算符。但是,如果存在 const 成员,则这不起作用,因此它毕竟无法生成赋值运算符。(在 C++11 中,这称为具有已删除的赋值运算符(。
最后,如果您有一些代码尝试使用赋值运算符,则会收到有关尝试使用已删除赋值运算符的错误。 某些标准库容器或算法需要存在赋值运算符。您没有显示所有代码,但是您将尝试在某个地方执行需要赋值的操作。
引用这个线程,关于带有 const 成员的复制构造函数,
复制构造函数的一般形式是,
class Foo {
Foo( const Foo& f ) :
mem1( f.mem1 ), mem2( f.mem2 ) /* etc */
{}
};
其中 mem1 和 mem2 是 Foo 的数据成员,可以是 const成员、非常量成员、常量引用或非常量引用。