目录
1. 作为成员变量的类没有默认构造函数
如果成员变量中包含其他类的对象,并且这个类没有默认构造函数,这个时候,编译器就不能合成默认构造函数。案例如下:
//sales_data.h
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
#include <iostream>
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;
};
#endif
//main.cpp
#include <iostream>
#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
这个时候我们有两种方法可以解决编译出错的问题: 第一,使用=default默认构造函数,否则,没有默认的构造函数可以用; 第二,定义类的成员变量时给出初始化。具体见以下案例。
2. =default默认函数
类比案例1,修改sales_data.h, 内容如下:
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
#include <iostream>
using namespace std;
class SalesData
{
public:
SalesData()=default;
SalesData(int sale_a):sale_isbn(sale_a)
{
}
private:
int sale_isbn = 0;
};
#endif
以上,编译通过,运行结果如下:
xuehaiyang@xuehaiyang-VPCEG27YC sales_data (study) $ make
g++ -I. sales_data.cpp -c
g++ -I. main.cpp -c
g++ sales_data.o main.o -o main
Make successful [0]
xuehaiyang@xuehaiyang-VPCEG27YC sales_data (study) $ ./main
SalesData totoal before...
SalesData totoal after...
3. 定义类的成员变量时给出初始化
类比案例1,修改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;
SalesData m_data = sale_init;
};
#endif
以上,编译通过,运行结果如下:
xuehaiyang@xuehaiyang-VPCEG27YC sales_data (study) $ make
g++ -I. sales_data.cpp -c
g++ -I. main.cpp -c
g++ sales_data.o main.o -o main
Make successful [0]
xuehaiyang@xuehaiyang-VPCEG27YC sales_data (study) $ ./main
SalesData totoal before...
SalesData totoal after...
4. 参考资料
《C++ primer》第五版