返回整个数组

时间:2014-03-27 00:02:18

标签: c++ class

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class Student
{
private:
    string name;
    int year;
    string semester;
    int AmtClass;
    string *CName;
    static string cohort[4];

public:
    Student();
    Student(int AmtClass);
    Student(Student &);

    void setCourses(string courses[], int n);
    void setName(string name);
    void setYear(int year);
    void setSemester(string semester);

    string getName();
    int getYear();
    string getSemester();
    int getAmtClass();
    string getCohort();
    string getCNames();
  //  ~Student();
};

string Student::cohort[4] = "";


Student::Student()
{
    name = "";
    year = 0;
    semester = "";
    AmtClass = 0;
}

//I am trying to create a dynamically allocated array of strings
Student::Student(int amount)
{
    AmtClass = amount;

    CName = new string[AmtClass];
}

void Student::setCourses(string courses[], int n)
{
    CName[n] = courses[n];
}

Student::Student(Student &obj)
{
    *this = obj;
}

void Student::setName(string Name)
{
    name = Name;
}

void Student::setYear(int Year)
{
    year = Year;

    switch(year)
    {
    case 1:
        cohort[0] = "Freshman";
        break;
    case 2:
        cohort[1] = "Sophomore";
        break;
    case 3:
        cohort[2] = "Junior";
        break;
    case 4:
        cohort[3] = "Senior";
        break;
    }
}

void Student::setSemester(string Semester)
{
    semester = Semester;
}

string Student::getName()
{
    return name;
}

int Student::getYear()
{
    return year;
}

string Student::getSemester()
{
    return semester;
}

int Student::getAmtClass()
{
    return AmtClass;
}

string Student::getCohort()
{
    year -= 1;
    return cohort[year];
}

//Returns only the first course name i entered, i want to return all
string Student::getCNames()
{
    return *CName;
}

void readStudentData(Student &);
void printStudentData(Student);

int main()
{
    int amount;
    cout << "How many courses are you currently taking? ";
    cin >> amount;

    Student kid(amount);

    readStudentData(kid);
    printStudentData(kid);
}

void readStudentData(Student &kid)
{
    cin.ignore(10000, '\n');

    int amount = kid.getAmtClass();
    string name = "";
    string semester = "";
    int year = 0;
    string *pName = new string[amount];

    cout << "What is your full name? ";
    getline(cin,name);
    kid.setName(name);

    cout << "Type in 1 for Freshman, 2 for Sophomore, 3 for Junior or 4 for Senior.";
    cout << "\nWhat year are you? ";
    cin >> year;
    while(cin)
    {   if(year >=1  && year <= 4)
        {
            kid.setYear(year);
            break;
        }
        else
        {
            cout << "Number must be between 1 and 4 Please try again." << endl;
            year = 0;
            cin >> year;
        }
    }

    cin.ignore();
    cout << "What is your current semester? ";
    getline(cin,semester);
    kid.setSemester(semester);

    cout << "Please enter the name of all your courses." << endl;
    for(int i = 0; i < amount; i++)
    {
        cout << "Course #" << i+1 << " : ";
        getline(cin,pName[i]);
        kid.setCourses(pName, i);
    }
}

void printStudentData(Student kid)
{
    Student kid2 = kid;
    cout << "\nHere is your information:" << endl;
    cout << "Name : " << kid2.getName() << endl;
    cout << "Semester : " << kid2.getSemester() << endl;
    cout << "Year : " << kid2.getCohort() << endl;
    for(int i = 0; i < kid2.getAmtClass(); i++)
    {
        cout << "Course #" << i+1 << " : " << kid2.getCNames() << endl;
    }
}

所以在这个函数中我试图创建一个程序来存储关于学生的信息。当我拿着学生的课程名称,然后将其打印出来时,我最终只输入了输入的第一个课程名称。我正在尝试打印用户输入的所有课程名称。我认为这个问题在访问者函数中。

以下是我的结果

How many courses are you currently taking? 2
What is your full name? Testing Name
Type in 1 for Freshman, 2 for Sophomore, 3 for Junior or 4 for Senior.
What year are you? 4
What is your current semester? Spring 2014
Please enter the name of all your courses.
Course #1 : C++
Course #2 : Adv C++

Here is your information:
Name : Testing Name
Semester : Spring 2014
Year : Senior
Course #1 : C++
Course #2 : C++

1 个答案:

答案 0 :(得分:1)

您可以使用数组元素的索引作为函数getCohort

的参数

例如

string getCohort( int i ) const;

并且函数必须返回与给定索引相对应的元素,如果索引无效,则返回空字符串。

另一种方法是使用标准类std::array<std::string, 4>并将其用作返回值。例如

class Student
{
private:
    string name;
    int year;
    string semester;
    int AmtClass;
    string *CName;
    std::array<std::string, 4> cohort;

   //...

我删除了关键字static,因为我不明白为什么这个数据成员是静态的。

该函数可以声明为

std::array<std::string, 4> getCohort() const;

如果数据成员string *CName;对应于课程并且您具有此类功能

void setCourses(string courses[], int n);

然后CName必须指向动态分配的数组,或者它应该是std::vector<std::string>类型的对象

例如     std :: vector CName;     //...

void setCourses( const std::string courses[], int n )
{ 
    CName.assign( courses, courses + n );
}

或者

#include <algorithm>
//...

std::string *CName;
//...

void setCourses( const std::string courses[], int n )
{ 
    CName = new std::string[n];

    std::copy( courses, courses + n, CName );
}

在最后一种情况下,不要忘记删除指针。