因此,对于我的任务,我有3个班级,学生,日期和地址。 Student类有两个Date类实例和一个Address类。
我的目标是能够从main.cpp创建一个来自Student类的对象数组。我尝试了几种不同的方法,但遇到了各种各样的问题。
编辑:这已被标记为重复但我发现的所有其他问题都没有完全/充分回答我在这里要做的事情的问题,请将我的问题与我联系起来找不到。 我正在尝试从类Student创建一个对象,该对象也包含类date和address的对象。
以下是我的相关文件中的代码。
#include "student.h"
using namespace std;
Student::Student(){
Student::fName = "";
Student::lName = "";
Student::gpa = "";
Student::credits = "";
Student::address;
Student::dBirth;
Student::dGraduation;
}//end Default Constructor
Student::Student(string firstName, string lastName, string s_gpa, string s_credits, Date *s_dBirth, Date *s_dGraduation, Address *s_address){
Student::fName = firstName;
Student::lName = lastName;
Student::gpa = s_gpa;
Student::credits = s_credits;
Student::dBirth = s_dBirth;
Student::dGraduation = s_dGraduation;
Student::address = s_address;
}//end Constructor
#ifndef STUDENT_H
#define STUDENT_H
#include <string>
#include <iostream>
#include "date.h"
#include "address.h"
class Student{
private:
std::string fName;
std::string lName;
std::string gpa;
std::string credits;
Date *dBirth;
Date *dGraduation;
Address *address;
public:
Student();//Default constructor
Student(std::string fName, std::string lName, std::string gpa, std::string credits, Date *dBirth, Date *dGraduation, Address *address);//Constructor
~Student();//Destructor
};//end Student Class
#endif // STUDENT_H
#include "date.h"
using namespace std;
Date::Date(){
Date::month = 0;
Date::day = 0;
Date::year = 0;
}//End default constructor
Date::Date(int sMonth, int sDay, int sYear){
Date::month = sMonth;
Date::day = sDay;
Date::year = sYear;
}//End constructor
#ifndef DATE_H
#define DATE_H
#include <string>
#include <iostream>
class Date{
private:
int month;
int day;
int year;
public:
Date();
Date(int month, int day, int year);
std::string getDate();
};//end Date Class
#endif // DATE_H
#include "address.h"
using namespace std;
Address::Address(){
Address::aLine1 = "";
Address::aLine1 = "";
Address::city = "";
Address::state = "";
Address:zip = "";
}//end Default Constructor
Address::Address(string line1, string line2, string sCity, string sState, string sZip){
Address::aLine1 = line1;
Address::aLine2 = line2;
Address::city = sCity;
Address::state = sState;
Address::zip = sZip;
}//End Constructor
#ifndef ADDRESS_H
#define ADDRESS_H
#include <string>
#include <iostream>
class Address{
private:
std::string aLine1;
std::string aLine2;
std::string city;
std::string state;
std::string zip;
public:
Address();
Address(std::string aLine1, std::string aLine2, std::string city, std::string state, std::string zip);
std::string getAddress();
};
#endif // ADDRESS_H
我是C ++的新手,非常感谢任何帮助。
答案 0 :(得分:0)
首先添加你的main(),以便我们可以看到出了什么问题。 第二 - 我认为你的指针部分有问题。请参阅C ++中new operator上的文档(另请参阅删除运算符)。
基本上你有两个 easy 来使用传递对象的方式:
示例(使用新的):
Date* d1 = new Date(...);
Date* d2 = new Date(...);
Address* a = new Address(...);
Student* s = new Student(..., d1, d2, a);
...
delete d1;
d1 = NULL;
delete d2;
d2 = NULL;
delete a;
a = NULL;
delete s;
s = NULL;
如果你想这样做,你也可以在Student课程的析构函数中添加delete-s:
Student::~Student()
{
delete dBirth;
dBirth = NULL;
delete dGraduation;
dGraduation = NULL;
delete address;
address = NULL;
}
请注意,您仍然需要使用删除处理Student* s
。
示例(使用堆栈):
Date d1(...);
Date d2(...);
Address a(...);
Student s(..., &d1, &d2, &a); // the & operator tells the compiler: pass these objects by reference
您还可以将上述两种方式组合在一起。 你的代码也有些奇怪,正如我在评论中提到的那样:
无需多次提及各种范围 - 一旦你说
string Address::getAddress() {
...
}
除非他们有不同的命名空间,否则您不需要明确提及您在其正文中使用的所有成员的范围
添加对课程成员的访问权限 - 您已经(部分)为您的地址和日期课程完成了这一操作,但现在您无权访问学生的成员,因为他们都是私人的!只要你认为足够,就添加get()和/或set(...)方法。
我看到你的getAddress()和getDate()是空的。我认为你不知道如何实现这些。这是一个可能的实现:
std::string Address::getAddress()
{
return aLine1 + " | " + aLine2 + " | " + ... + zip; # + stands for concatenation
}
# requires #include<sstream>
std::string Date::getDate()
{
std::stringstream ss;
ss << year << "/" << month << "/" << day;
return ss.str();
}
使用 this 而不是在变量前面添加类范围(下面的示例是针对Address类的构造函数):
Address(std::string aLine1, ...)
{
this->aLine1 = aLine1;
...
}
或者只是以不同的方式调用方法参数以避免名称冲突。良好的老式方式是添加&#34; _&#34;在名字前面:
Address(std::string _aLine1, ...)
{
aLine1 = _aLine1;
...
}
修改强>
以下是您的标题和来源的连接方式:
所以基本上这里是每个文件的包含的简短列表(我不包括其余的所有文件):
编辑:补充说明:date.h和address.h包含在student.h中,相应地添加到main.cpp中。这会创建一个标题链(address.h和date.h通过student.h间接包含在main.cpp中),这就是为什么我在最终列表中省略了这些标题。