我将课程设计如下
但我在执行时遇到运行时错误。
请告诉我以下解决方案
为什么main3中的Line3会出现编译错误(如果我只想初始化该类的一个成员,我需要做什么)
为什么我在第4行遇到运行时错误。
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
class A{
int age;
char *name;
char info[50];
public:
A(int p_age=0,char *p_name=NULL,char p_info[]=NULL)
{
cout<<"Constructor called"<<endl;
age=p_age;
int length1=strlen(p_name)+1;
int length2=strlen(p_info)+1;
strncpy(name,p_name,length1);
name[length1-1]='\0';
strncpy(info,p_info,length2);
info[length2-1]='\0';
}
void get()
{
cout<<"Enter the age";
cin>>age;
cout<<"Enter name & info";
gets(name);
gets(info);
}
void display()
{
cout<<age<<name<<info;
}
};
int main()
{
A obj(20,"Ename","Stud");
obj.display();
// A obj1("EEEE");//Line3
A obj2; //Line 4
obj2.get();
obj2.display();
}
答案 0 :(得分:1)
A obj1("EEEE")
是一个错误,因为构造函数的第一个参数被声明为int p_age
,并且编译器无法自动将"EEEE"
强制转换为int
。尝试初始化obj2
会导致错误,因为您在调用中未提供任何参数,因此使用默认值,并且当执行行int length1=strlen(p_name)+1;
时,strlen()
从访问内存时崩溃p_name
,为NULL。
答案 1 :(得分:0)
名称未分配。
...
int length1=strlen(p_name)+1;
int length2=strlen(p_info)+1;
name = new char[length1]; // add this line
strncpy(name,p_name,length1);
name[length1-1]='\0';
strncpy(info,p_info,length2);
info[length2-1]='\0';
...
答案 2 :(得分:0)
int
,而您正试图通过const char*
。p_name
的默认初始化为NULL,strlen
为null会导致分段错误答案 3 :(得分:0)
在声明中
A obj2
您没有提供p_name
和p_info
参数,因此它们默认为NULL。然后在构造函数中调用
strlen(p_name)
p_name
上的是NULL。这是不允许的。
答案 4 :(得分:0)
让C ++帮助你。
class A{
int age;
std::string name;
std::string info;
public:
explicit A(int p_age = 0, const std::string& p_name = "", const std::string& p_info = "")
: age(p_age)
, name(p_name)
, info(p_info)
{
}
};