c++ - 使用指针和动态数组类

标签 c++ class pointers dynamic-arrays

我目前正在编写一个程序,该程序将帮助大学跟踪哪些学生参加了哪些俱乐部。这段代码将被粘贴到现有的可用代码中,正如我的教授所提供的那样。 有人可以查看我的代码并帮助我解决错误吗?我添加了注释来解释每件事应该 做什么。

另外,请注意这是一项作业,我无法更改类(class)的任何内容。我也是初学者,所以请保持简单。非常感谢您的帮助。

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;

}

关于c++ - 使用指针和动态数组类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23304893/

相关文章:

c++ - C++中的虚拟模板函数

c++ - lambda 中的递归调用 (C++11)

delphi - 如何在Delphi 2009中声明静态变量?

android - Dalvik 文件格式 (*.dx) 是否支持比 Java .class 文件更多的指令?

c++ - 我怎么知道指向基类对象的指针数组中元素的类型是什么,它将为派生类分配内存

C++ - 参差不齐的 4d 数组

c++ - 多维数组 (C++)

Java 在运行时加载用户指定的类

c++ - 如何确保指针不指向同一个地方

c++ - C++中如何判断指针指向的对象类型?