类构造函数的问题

allen0228 2008-11-28 11:29:02
有如下定义的类
class Person{
private:
str_class name;
char sex;
int age;
public:
Person(char *,int ,char );
~Person(){};
void print();
};
其中str_class 是另外一个类
class str_class
{
public:
char *str;
public:

str_class(const char *s)
{
str = new char[strlen(s) + 1];
strcpy(str,s);
}

str_class(const str_class &a)
{
str = new char[strlen(a.str) + 1];
strcpy(str,a.str);
}


void print()
{
cout << str << endl;
}

~str_class()
{
delete str;
}

};

我再Person类中的构造函数是否可以写成
Person(char *,int ,char );

我测试 是不可以 如何解释这个问题
出错提示
error C2512: 'str_class' : no appropriate default constructor available
...全文
159 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen0228 2008-11-28
  • 打赏
  • 举报
回复
楼上的
str_class(const char *s)
{
str = new char[strlen(s) + 1];
strcpy(str,s);
}

str_class(const str_class &a)
{
str = new char[strlen(a.str) + 1];
strcpy(str,a.str);
}

我不是又构造函数吗 不理解
还有一点 你加个const char *s = NULL 是什么意思
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
修改了一下,主要原因就是因为你的str_class没有默认的构造函数,完整程序如下:
//其中str_class 是另外一个类 
class str_class
{
public:
char *str;
public:

str_class(const char *s = NULL)
{
str = new char[strlen(s) + 1];
strcpy(str,s);
}

str_class(const str_class &a)
{
str = new char[strlen(a.str) + 1];
strcpy(str,a.str);
}


void print()
{
cout << str << endl;
}

~str_class()
{
delete str;
}

};

class Person{
private:
str_class name;
char sex;
int age;
public:
Person(char *,int ,char ){}
Person() {}
~Person(){};
void print();
};

int main()
{
Person a;
}
allen0228 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cyblueboy83 的回复:]
那样写没错
但你的意思应该是:
Person::Person(char* str, int n, char ch) : name(str), age(n), sex(ch) {}
[/Quote]

那我如何将它写成显示的呢
Person::Person(char *nm,int ag,char sx):name(nm)
{
//name.str = nm;
age = ag;
sex = sx;
}
特别是红色部分

或者说 我是否可以写成显示的
herman~~ 2008-11-28
  • 打赏
  • 举报
回复
那样写没错
但你的意思应该是:
Person::Person(char* str, int n, char ch) : name(str), age(n), sex(ch) {}
toadzw 2008-11-28
  • 打赏
  • 举报
回复
你是想用隐式转换的吧。。。哈哈,当然是可以的,因为char*到str_class因有构造函数存在,所有提供隐式转换;
toadzw 2008-11-28
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <iterator>
using namespace std;
class str_class
{
public:
char *str;
public:

str_class(const char *s)
{
str = new char[strlen(s) + 1];
strcpy(str,s);
}

str_class(const str_class &a)
{
str = new char[strlen(a.str) + 1];
strcpy(str,a.str);
}


void print()
{
cout << str << endl;
}

~str_class()
{
delete str;
}

};

class Person{
private:
str_class name;
char sex;
int age;
public:
Person(char * str,int n ,char ch ): name(str), age(n), sex(ch) {}
~Person(){};
void print();
};

int main(){
Person("kk",3,'d');

return 0;
}
tangshuiling 2008-11-28
  • 打赏
  • 举报
回复
1、可以
2、把name定义为对象指针str_class *name;直接定义为对象的话,把类的编译顺序调整,Person类在str_class之后
qqwx_1986 2008-11-28
  • 打赏
  • 举报
回复

类str_class没有缺省的构造函数
里面加个str_class(){}

nullah 2008-11-28
  • 打赏
  • 举报
回复

#include <iostream>
using std::cout;
using std::endl;

class str_class
{
public:
char *str;
public:

str_class(const char *s)
{
str = new char[strlen(s) + 1];
strcpy(str,s);
}

str_class(const str_class &a)
{
str = new char[strlen(a.str) + 1];
strcpy(str,a.str);
}


void print()
{
cout << str << endl;
}

~str_class()
{
delete str;
}

};

class Person{
private:
str_class name;
char sex;
int age;
public:
Person(char *,int ,char );
~Person(){};
void print();
};
//其中str_class 是另外一个类



编译通过

构造函数可以写成那样
Vegertar 2008-11-28
  • 打赏
  • 举报
回复
必须保证在进入构造函数体中时它的子对象已经初始化
Mougou 2008-11-28
  • 打赏
  • 举报
回复
可以那样写,创建对象时也要提供相应的参数,否则编译就会报上面的错
Vegertar 2008-11-28
  • 打赏
  • 举报
回复
Person::Person(char* str, int n, char ch) : name(str), age(n), sex(ch) {}
cba_v 2008-11-28
  • 打赏
  • 举报
回复
up
zhouqing19871024 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 suiye 的回复:]
引用 13 楼 ztz0223 的回复:
你有构造函数和默认构造函数不是一个东西

C/C++ codeconst char *s = NULL


就是替你补上默认构造函数
呵呵
缺省参数的使用,你应该看看书


才肯了一个星期的c++ 我正在看书 又太多的不理解
[/Quote]
呵呵 加油加油 兄弟我也正在看这本书,以后大家可互相切磋!
allen0228 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ztz0223 的回复:]
你有构造函数和默认构造函数不是一个东西

C/C++ codeconst char *s = NULL


就是替你补上默认构造函数
呵呵
缺省参数的使用,你应该看看书
[/Quote]

才肯了一个星期的c++ 我正在看书 又太多的不理解
frp529 2008-11-28
  • 打赏
  • 举报
回复
错了是str_class这个类没有默认的构造
因为你定义一个str_class的对象
frp529 2008-11-28
  • 打赏
  • 举报
回复
'str_class' : no appropriate default constructor available
意思是没有找到默认的构造函数
Person();
roadblossom 2008-11-28
  • 打赏
  • 举报
回复
up
xxgamexx 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ztz0223 的回复:]
修改了一下,主要原因就是因为你的str_class没有默认的构造函数,完整程序如下:
C/C++ code//其中str_class 是另外一个类classstr_class
{public:char*str;public:

str_class(constchar*s=NULL)
{
str=newchar[strlen(s)+1];
strcpy(str,s);
}

str_class(conststr_class&a)
{
str=newchar[strlen(a.str)+1];
strcpy(str,a.str);
}voidprint()
{

[/Quote]

可能上面这样写会有点问题 strlen(NULL) 发生段错误;


#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class str_class
{
public:
char *str;
public:
str_class() //显示定义默认构造函数
{
str=NULL;
}
str_class(const char *a)
{
str=new char[strlen(a)+1];
strcpy(str,a);
}
str_class(const str_class &a)
{

str = new char[strlen(a.str) + 1];
strcpy(str,a.str);
}


void print()
{
cout << str << endl;
}

~str_class()
{

delete str;
str=NULL;
}

};

class Person{
private:
str_class name; //这样申明对象会调用 默认构造函数,而你却缺少一个默认构造函数,所以报错!
char sex;
int age;
public:
Person(char *,int ,char ){}
Person() {}
~Person(){};
void print();
};

int main()
{
Person a;
return 0;
}



这样就安全些了 ~
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
你有构造函数和默认构造函数不是一个东西
const char *s = NULL 

就是替你补上默认构造函数
呵呵
缺省参数的使用,你应该看看书

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧