[英]c++ classes and pointers
我有这个硬件问题
创建一个名为gender 的枚举数,它有两个可能的值,男性和女性。Person 类定义在以下代码中给出。 使用所有必需的类和枚举器来实现它,并测试 main 中的所有成员函数。
#ifndef Person_h #define Person_h #include <iostream> #include "address.h" // header file for the Address class #include "gender.h" // header file for the Gender enum using namespace std; class Person { public: Person(); Person(const char * n, const Gender * g, const Address * ad); Person(const Person & f); void setName(char * n); void setAds( Address * ad ); char * getName()const ; Address *getAds()const ; ~Person(); private: char * name; Gender * gender; Address * ads; }; #endif
这是我的尝试:
地址.h
#pragma once
class Address
{
public:
Address(const char *streetv="noName", const char*telv="noTel", const int POBoxv=0);
Address(Address &address);
~Address();
void setAll(const char *streetv, const char*telv, const int POBoxv);
char *getStreet()const;
char *getTe ()const;
int getPOBox()const;
void setStreet(char *str);
void setTel(char *t);
void setPOBox(int po);
private:
char *street;
char *tel;
int POBox;
};
enum Gender{Male,Female,unknown};
地址.cpp
#include "Address.h"
#include<iostream>
using namespace std;
Address::Address(const char *streetv, const char*telv, const int POBoxv)
{
street=new char[30];
strcpy(street,streetv);
tel=new char[30];
strcpy(tel,telv);
POBox=POBoxv;
}
人.h
#pragma once
#include "Address.h"
class Person
{
public:
Person();
Person(const char * n, const Gender * g, const Address * ad);
Person(const Person & f);
void setName(char * n);
void setAds( Address * ad );
char * getName()const ;
Address *getAds()const ;
~Person();
private:
char * name;
Gender * gender;
Address * ads;
};
个人.cpp
#include "Person.h"
#include "Address.h"
#include<iostream>
#include<cstring>
using namespace std;
Person::Person()
{
name=new char[30];
strcpy(name,"unknown");
gender=new Gender;
*gender=unknown;
ads->setAll("unknown","unknown",0);
}
Person::Person(const char * n, const Gender * g, const Address * ad)
{
name=new char[30];
strcpy(name,n);
*gender=Male;
*ads=*ad;
}
void Person:: setName(char * n){
name=new char[30];
strcpy(name,n);
}
void Person:: setAds( Address * ad ){
ads=ad;
}
char* Person::getName()const{
return name;
}
Address* Person::getAds()const{
return ads;
}
Person::Person(const Person & f){
name=f.name;
gender=f.gender;
ads=f.ads;
}
Person::~Person(void)
{
delete [] name;
}
主要的
#include "Address.h"
#include "Person.h"
#include<iostream>
using namespace std;
void main(){
Address ad("New street","0501234567",1234);
//testing Person();
Person pe;
cout<<"Name: "<<pe.getName()<<" Street: "<<pe.getAds()<<endl;
//testing Person(const char * n, const Gender * g, const Address * ad);
Person p ("Adam",Male,ad);
cout<<"Name: "<<pe.getName()<<" Street: "<<pe.getAds()<<endl;
//testing Person(const Person & f);
Person p2 (pe);
cout<<p2.getAds()<<endl;
//testing set functions
p2.setName("Ali");
p2.setAds(&ad);
//testing get functions
cout<<"Name: "<<pe.getName()<<" Street: "<<pe.getAds()<<endl;
}
编译器一直在这一行突出显示 main 中的“Adam”这个词
Person p ("Adam",Male,ad);
因为“没有构造函数“Person::Person”与参数列表匹配”
即使我删除了该行,编译器也会无缘无故地崩溃,你能帮忙吗?
假设Gender
是一个枚举类型(应该是),问题是,构造函数签名需要一个指向Gender
枚举参数的指针:
Person::Person(const char * n, const Gender * g, const Address * ad)
// ^^^^^^^^^^^^^^^^
但是你在main()
传递了普通的枚举值:
Person p ("Adam",Male,ad);
// ^^^^
构造函数签名应更改为
Person::Person(const char * n, Gender g, const Address * ad)
// ^^^^^^^^
或者您应该在调用时采用(可选const
)枚举变量的地址:
const Gender g = Male;
Person p ("Adam",&g,ad);
// ^
另请注意,为Gender
构造函数参数提供的任何内容都未在您的定义中使用:
Person::Person(const char * n, const Gender * g, const Address * ad) {
name=new char[30];
strcpy(name,n);
*gender=Male; // <<<<< Always initialized to Male, regardless g's value, and no memory allocated at all
*ads=*ad;
}
应该:
gender = new Gender(*g);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.