目录
1. 作为成员变量的类没有默认构造函数
2. 参考资料
1. 作为成员变量的类没有默认构造函数
如果成员变量中包含其他类的对象,并且这个类没有默认构造函数,这个时候,编译器就不能合成默认构造函数。案例如下:
//sales_data.h #ifndef SALES_DATA_H #define SALES_DATA_H #include#include using namespace std; class SalesData { public: SalesData(int sale_a):sale_isbn(sale_a) { } private: int sale_isbn = 0; }; #endif
//sales_man.h #ifndef SALES_MAN_H #define SALES_MAN_H #include "sales_data.h" //global variable SalesData sale_init(0); class SalesMan { private: string sale_name; SalesData m_data = sale_init; }; #endif
//main.cpp #include#include "sales_data.h" #include "sales_man.h" int main() { std::cout << "SalesData totoal before..." << std::endl; SalesMan zhang_san; std::cout << "SalesData totoal after..." << std::endl; return 0; }
使用以下Makefile编译
TGT:= main SRC:= $(wildcard *.cpp) OBJ:= $(patsubst %cpp,%o,$(SRC)) CPPFLAGS := -I. all:$(TGT) >---@echo "Make successful [0]" $(TGT):$(OBJ) >---g++ $^ -o $@ %.o:%.cpp >---g++ $(CPPFLAGS) $< -c- clear: >---rm $(OBJ) $(TGT) log.log .PHONY: all clear
编译出错,如下
main.cpp: In function ‘int main()’: main.cpp:9:14: error: use of deleted function ‘SalesMan::SalesMan()’ SalesMan zhang_san; ^~~~~~~~~ In file included from main.cpp:4:0: sales_man.h:9:7: note: ‘SalesMan::SalesMan()’ is implicitly deleted because the default definition would be ill-formed: class SalesMan ^~~~~~~~ sales_man.h:9:7: error: no matching function for call to ‘SalesData::SalesData()’ In file included from main.cpp:3:0: sales_data.h:11:5: note: candidate: SalesData::SalesData(int) SalesData(int sale_a):sale_isbn(sale_a) ^~~~~~~~~ sales_data.h:11:5: note: candidate expects 1 argument, 0 provided sales_data.h:8:7: note: candidate: constexpr SalesData::SalesData(const SalesData&) class SalesData ^~~~~~~~~ sales_data.h:8:7: note: candidate expects 1 argument, 0 provided sales_data.h:8:7: note: candidate: constexpr SalesData::SalesData(SalesData&&) sales_data.h:8:7: note: candidate expects 1 argument, 0 provided make: *** [main.o] Error 1
这个时候我们必须自定义默认构造函数,否则,没有默认的构造函数可以用。
2. 参考资料
《C++ primer》第五版