使用指针和动态数组初始化

Class with Pointer and Dynamic Arrays

本文关键字:数组 初始化 动态 指针      更新时间:2023-10-16

我目前正在编写一个程序,该程序将帮助大学跟踪哪些学生参加了哪些俱乐部。这个代码将粘贴到现有的有效代码中,由我的教授提供。有人能帮我检查一下代码,帮我解决错误吗?我加入了评论来解释应该做什么

另外,请注意,这是一项作业,我不能改变任何关于这门课的内容。我也是一个初学者,所以请保持简单。我们将不胜感激你的帮助。

class Club
{
public:
    Club();
    Club(Club &c);
    Club(string cname);
    void addMember(string name);
    void removeMember(string name);
    string getClubName() const;
    string setClubName(const string& nameOfClub);
    void loadClub();
    bool isMember(string& name) const;
    string getAllMembers() const;
    friend Club mergeClubs(Club& c1, Club& c2);
    ~Club();
private:
    string *members;
    int numMembers;
    string clubName;
};
Club::Club()
{
    clubName = "";
    numMembers = 0;
}
Club::Club(Club &c)
{
    numMembers = c.numMembers;
    members = new string [numMembers];
    for (int i = 0; i < numMembers; i++)
    {
        members[i] = c.members[i];
    }
    //copy constructor
    //watch out for memory leaks
}
Club::Club(string cname)
{
    clubName = cname;
    //cname should be saved as the club's name in the clubName variable
}
void Club::addMember(string name)
{
    string *m;
    m = new string [numMembers];
    string *members = m;
    for (int i = 0; i < numMembers; i++)
    {
        for (int j = 0; j < name.length(); i++)
        {
            m[i] = name[j];
        }
    }
    delete [] m;
    //adds new member to the club
    //records their name in the members variable
    //may need a dynamic array to make this work, watch for memory leaks!
}
void Club::removeMember(string name)
{
    string *m;
    m = new string [numMembers];
    string *members = m;
    for (int i = 0; i < numMembers; i++)
    {
        if ( m[i] == name)
        {
            m[i] = "";
        }
    }
    delete [] m;
    //deletes the person from the array in members
    //will do nothing if the person is not in the array to begin with
    //may require dynamic array to make this work- watch for memory leaks!
    //if the person's name appears more than once, just delete the first instance
}
string Club::getClubName() const
{
    return clubName;
    //getter of clubName
}
string Club::setClubName(const string& nameOfClub)
{
    return clubName = nameOfClub;
    //setter of clubName
}
void Club::loadClub()
{
    //should print "tell me the name of the next member of the club"
    //reads into the variable name
    //uses addMember() to add that person to the club
    //the input should include up to the line break as the name, so it should take in "jane doe" as an entry
    //keeps asking for more names until the user enters a blank entry
    string name;
    do
    {
        cout << "Tell me the name of the next member of the club, ";
        cout << "or submit a blank entry to stopent ering names." << endl;
        getline(cin, name, 'n');
        addMember(name);
    } while (name != "");
}
bool Club::isMember(string& name) const
{
    /*for (int i = 0; i < numMembers; i++)
    {
        for (int j = 0; j < name.length(); j++)
        {
            if (members[i] == name)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }*/
    for (int i = 0; i < numMembers; i++)
    {
        if (members[i] == name)
        {
            return true;
        }
        return false;
    }
    //returns true if the person is a member of the club, false otherwise
}
string Club::getAllMembers() const
{
    for (int i = 0; i < numMembers; i++)
    {
        return members[i];
        cout << ", ";
    }
    cout << endl;
    //returns a string of all the names of the members of the club
    //commas and spaces separating every entry of the list
    //should not be a comma following the last name in the list
}
Club mergeClubs(Club& c1, Club& c2)
{
    //creates a new club from 2 existing clubs
    //combined club name should be Club 1/Club 2
    Club temp;
    temp.clubName = c1.clubName + "/" + c2.clubName;
    return temp;
}
Club::~Club()
{
    delete [] members;
    //destructor
    //watch out for memory leaks
}

由于某种原因,我无法理解我已经(大部分)为您更正了这个程序。仍然存在一些令人讨厌的事情,比如将字符串的副本传递到const函数中,但修复这些问题只是优化。至少这个程序在逻辑上是正确的。

#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
using namespace std;
class Club
{
public:
    Club();
    Club(const Club &c);
    Club(string cname);
    void addMember(string name);
    void removeMember(string name);
    string getClubName() const;
    string setClubName(const string& nameOfClub);
    void loadClub();
    bool isMember(const string& name) const;
    string getAllMembers() const;
    friend Club mergeClubs(Club& c1, Club& c2);
    ~Club();
private:
    vector<string> members;
    string clubName;
};
Club::Club()
: members()
, clubName()
{
}
Club::Club(const Club &c)
: members(c.members)
, clubName(c.clubName)
{
}
Club::Club(string cname)
: members()
, clubName(cname)
{
}
void Club::addMember(string name)
{
    members.push_back(name);
}
void Club::removeMember(string name)
{
    members.erase(remove(members.begin(), members.end(), name), members.end());
}
string Club::getClubName() const
{
    return clubName;
    //getter of clubName
}
string Club::setClubName(const string& nameOfClub)
{
    return clubName = nameOfClub;
    //setter of clubName
}
void Club::loadClub()
{
    //should print "tell me the name of the next member of the club"
    //reads into the variable name
    //uses addMember() to add that person to the club
    //the input should include up to the line break as the name, so it should take in "jane doe" as an entry
    //keeps asking for more names until the user enters a blank entry
    string name;
    do
    {
        cout << "Tell me the name of the next member of the club, ";
        cout << "or submit a blank entry to stopent ering names." << endl;
        getline(cin, name, 'n');
        addMember(name);
    } while (name != "");
}
bool Club::isMember(const string& name) const
{
    return find(members.begin(), members.end(), name) != members.end();
}
string Club::getAllMembers() const
{
    stringstream result;
    vector<string>::const_iterator b = members.begin(), e = members.end();
    for (bool comma = false ; b != e; ++b, comma = true)
    {
        if (comma) {
            result << ", ";
        }
        result << *b;
    }
    return result.str();
}
Club mergeClubs(Club& c1, Club& c2)
{
    Club temp(c1.clubName + "/" + c2.clubName);
    struct memberAdd { 
        Club& _club;
        memberAdd(Club& club) : _club(club) {}
        void operator()(const string& member) {
            _club.addMember(member);
        }
    };
    for_each(c1.members.begin(), c1.members.end(), memberAdd(temp));
    for_each(c2.members.begin(), c2.members.end(), memberAdd(temp));
    return temp;
}
Club::~Club()
{
    //destructor
    //watch out for memory leaks
}
int main()
{
    Club boys("red");
    boys.addMember("Ben");
    boys.addMember("Paul");
    Club girls("blue");
    girls.addMember("Lucy");
    girls.addMember("Hermione");
    Club unisex = mergeClubs(boys, girls);
    cout << unisex.getClubName() << " has the following members: " << unisex.getAllMembers() << endl;
}

一些初始注释:

  1. 复制构造函数应该采用const Club&像这样:

    俱乐部(const俱乐部和俱乐部)

  2. members和numMembers是不合时宜的。对成员使用std::vector,并将numMembers全部删除(std::vector有一个size()方法)。

  3. Club::Club不初始化members或numMembers。这将导致脱模器可能发生碰撞。如果用向量替换它们,就会解决这个问题。

  4. addMember中的逻辑没有意义。

  5. 也不在removeMember 中

  6. isMember应该取一个常量字符串&建议您按照std::find()(#include<algorithm>)编写

  7. 我可以继续…