lwflourish

哪怕自己是一个菜鸟,也要努力使自己展翅高飞
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

error C2512: “Name”: 没有合适的默认构造函数可用

Posted on 2014-11-14 20:07  lwflourish  阅读(3156)  评论(0编辑  收藏  举报

error C2512: “Name”: 没有合适的默认构造函数可用

 1 #include <iostream>
 2 #include <string>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 class Name
 7 {
 8 public:
 9     Name (char *fst,char * last );
10     //Name (){};
11 string GetName() const ;
12 void setName (const string &fst,const string &last);
13 const string &getFirstName()const {return firstName;}
14 const string &getLastName()const {return lastName;}
15 void print() const ;
16 
17 protected:
18     string firstName; //字符串本身是以字符数组的形式存储的;
19     string lastName;
20 };
21 Name::Name(char *fst,char * last ):firstName(fst),lastName(last)
22 {
23 }
24 string Name::GetName()const
25 {
26     return (firstName+lastName);
27 }
28 
29 void Name::setName(const string &fst,const string &last)
30 {
31 firstName =fst;
32 lastName =last;
33 }
34 
35 void Name::print()const
36 {
37 cout << firstName <<" "<<lastName<<endl;
38 }
39 
40 class Person 
41 {
42 public :
43 Person (const Name &n, char *paddr,char *pcity,char *pprov,char *zip);
44 void setName(const Name &n);
45 void print() const ;
46 protected:
47     Name name;
48     string addr;
49     string city;
50     string prov;
51     string ZIP;
52 };
53 
54 Person::Person(const Name& n, char *paddr,char *pcity,char *pprov,char *zip)
55 {
56 name =n;
57 addr =paddr;
58 city =pcity;
59 prov =pprov;
60 ZIP =zip;
61 }
62 void Person ::setName(const Name &n)
63 {
64     name.setName(n.getFirstName(),n.getLastName());
65 }
66 void Person::print()const
67 {
68     cout << name.GetName()<<" "<<addr<<" "<<city<<" "<<prov<<" "<<ZIP<<" "<<endl;
69 }
70 int main ()
71 {
72 Person p(Name ("",""),"交大东路1号","大连","辽宁","116026");
73 cout <<"修改名字前:"<<endl;
74 p.print();
75 
76 cout <<"修改名字后:"<<endl;
77 Name n("","");
78 p.setName(n);
79 p.print();
80 return 0;
81 }

1.去掉代码,出现了如上所示错误:

Name (){};

key:由于你在Name中定义了其他构造函数,那么,编译器不会为你创建默认构造函数;然而,你在Person的构造函数中没有调用Name的构造函数,那么,编译器会调用Name的默认构造函数,然而,却没有定义,所以,产生了“error C2512: “Name”: 没有合适的默认构造函数可用”错误!

2.#include<string>和#include<cstring>的问题

e:\ccode\test_name\test_name\test.cpp(26): error C2676: 二进制“+”:“const std::string”不定义该运算符或到预定义运算符可接收的类型的转换
e:\ccode\test_name\test_name\test.cpp(37): error C2679: 二进制“<<”: 没有找到接受“const std::string”类型的右操作数的运算符(或没有可接受的转换)

当为#include<cstring>出现如上两条错误提示;

key:string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; CString(typedef CStringT > CString)为Visual C++中最常用的字符串类,前者是C++中的标准string类,拥有强大的字符串操作,后者只是C里面的一个库,功能较弱。STL是标准类模板库,里面有很多的类,如:vector、map等等。都是一些方便编程的好东西。