如何正确地通过不同的类传递对象?

时间:2015-07-31 06:24:31

标签: c++ object

因此,对于我的任务,我有3个班级,学生,日期和地址。 Student类有两个Date类实例和一个Address类。

我的目标是能够从main.cpp创建一个来自Student类的对象数组。我尝试了几种不同的方法,但遇到了各种各样的问题。

编辑:这已被标记为重复但我发现的所有其他问题都没有完全/充分回答我在这里要做的事情的问题,请将我的问题与我联系起来找不到。 我正在尝试从类Student创建一个对象,该对象也包含类date和address的对象。

以下是我的相关文件中的代码。

student.cpp

#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

student.h

#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

date.cpp

#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

date.h

#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

address.cpp

#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

address.h

#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 ++的新手,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

首先添加你的main(),以便我们可以看到出了什么问题。 第二 - 我认为你的指针部分有问题。请参阅C ++中new operator上的文档(另请参阅删除运算符)。

基本上你有两个 easy 来使用传递对象的方式:

  • 您可以使用 new 运算符动态分配对象并将指针传递给Student - 这样做的缺点是您必须为动态分配的对象手动释放内存(使用如果是数组,请删除删除[]
  • 在堆栈上创建对象 - 这样做的好处是您无需关心内存管理。

示例(使用新的):

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

您还可以将上述两种方式组合在一起。 你的代码也有些奇怪,正如我在评论中提到的那样:

  1. 无需多次提及各种范围 - 一旦你说

    string Address::getAddress() {
      ...
    }
    

    除非他们有不同的命名空间,否则您不需要明确提及您在其正文中使用的所有成员的范围

  2. 添加对课程成员的访问权限 - 您已经(部分)为您的地址和日期课程完成了这一操作,但现在您无权访问学生的成员,因为他们都是私人的!只要你认为足够,就添加get()和/或set(...)方法。

  3. 我看到你的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();
    }
    
  4. 使用 this 而不是在变量前面添加类范围(下面的示例是针对Address类的构造函数):

    Address(std::string aLine1, ...)
    {
      this->aLine1 = aLine1;
      ...
    }
    

    或者只是以不同的方式调用方法参数以避免名称冲突。良好的老式方式是添加&#34; _&#34;在名字前面:

    Address(std::string _aLine1, ...)
    {
      aLine1 = _aLine1;
      ...
    }
    
  5. 修改

    以下是您的标题和来源的连接方式:

    1. student.h - 包含在student.cpp中(因为student.cpp实现了您在student.h中描述的内容)和main.cpp(因为您要声明一个或多个学生)对象并对它们做一些事情;因为当你在main.cpp中包含student.h时,student.h包含address.h和date.h,代码将会在#34;中查看&#34;这些标题中的内容太)
    2. address.h - 包含在address.cpp中(因为address.cpp实现了你在address.h中描述的内容),student.h(因为你已经声明你的学生班有类Address(Address)和main.cpp的一个类成员(因为你想声明一个或多个Address对象并将它们传递给一堆Student对象)
    3. date.h - 包含在date.cpp中,student.h(因为date.cpp实现了你在date.h中描述的内容)和main.cpp(因为你要声明一个或多个Date对象并将它们传递给一堆Student对象)
    4. 所以基本上这里是每个文件的包含的简短列表(我不包括其余的所有文件):

      • student.h:address.h,date.h
      • student.cpp:student.h
      • address.cpp:address.h
      • date.cpp:date.h
      • main.cpp:student.h

      编辑:补充说明:date.h和address.h包含在student.h中,相应地添加到main.cpp中。这会创建一个标题链(address.h和date.h通过student.h间接包含在main.cpp中),这就是为什么我在最终列表中省略了这些标题。