怎样可以使Score变为私有类?

Fancy 发布于 2015年12月22日
无人欣赏。

     以下为我练手的学生成绩查询代码段,共有两个类,一个是Score类,我想把它设为私有类,另一个为Manager类,Manager为Score类的友元。

Score.h
    #include <map>
    #include <string>
    #include <iostream>
    #ifndef SCORE_H
    #define SCORE_H

struct Score
{
    friend class Manager;
    typedef std::map<std::string,double> scMap;
    typedef std::map<std::string,double>::value_type index;//pair类型
    Score():scoreMap(){}
    Score(scMap &s):scoreMap(s){}
    Score(index &i){scoreMap.insert(i);}
    void updateScore(const std::string &,double);//根据科目修改成绩
    bool insertScore(index newScore)
    {
        if((scoreMap.insert(newScore)).second==true)
            return true;
        else
        {
            std::cout<<"this project's score has existed!"<<std::endl;
            return false;
        }
    }
    double requeryScore(const std::string &)const;
    bool deleteSigleScore(const std::string &);
    std::map<std::string,double> scoreMap;
};
#endif

Score.cpp:

#include "StdAfx.h"
#include <iostream>
#include "Manager.h"
#include "Score.h"

void Score::updateScore(const std::string &pro,double newScore)
{
    if(scoreMap.count(pro))
    {
        scoreMap[pro]=newScore;
    }
    else
    {
        std::cout<<"This student's "<<pro<<"don't exist!"<<std::endl;
    }
}

double Score::requeryScore(const std::string & sc)const
{
    if(scoreMap.count(sc))
    {
        double newScor=(*(scoreMap.find(sc))).second;
        return newScor;
    }
    else
    {
        std::cout<<"This student's "<<sc<<"don't exist!"<<std::endl;
        return 0;
    }
}

bool Score::deleteSigleScore(const std::string &spro)
{
    if(scoreMap.erase(spro))
    {
        return true;
    }
    else
        return false;
}

Manager.h

 #pragma once
    #include <map>
    #include <string>
    #include <iostream>
    #include "Score.h"

    #ifndef MANAGER_H
    #define MANAGER_H

class Manager
{
    typedef std::map<std::string,Score> studentMap;
public:
    //只添加学生,不添加成绩
    bool add(const std::string &);
    //同时添加姓名以及成绩
    bool add(const std::string &,Score::index);
    bool add(const std::string &,Score::scMap &);
    /*void insertScore(const std::string &,*/
    bool deleteStu(const std::string &);
    bool deleteScore(const std::string &,const std::string &);
    bool updateName(const std::string &,const std::string &);
    bool updateScore(const std::string &,const std::string &,double);
    double querySingleScore(const std::string &,const std::string &);
    std::map<std::string,double> queryAllScore(const std::string &);

private:
    std::map<std::string,Score> stuMap;
};
#endif

Manager.cpp

#include "StdAfx.h"
#include "Manager.h"
#include <iostream>
#include <utility>
#include <iostream>
#include <map>

bool Manager::add(const std::string &sname)
{
    if(stuMap.count(sname))
    {
        std::cout<<sname<<"has existed"<<std::endl;
        return false;
    }
    else
    {
        std::pair<std::string,Score> newP;
        newP.first=sname;
        newP.second=Score();
        stuMap.insert(newP);
    }

}

bool Manager::add(const std::string &sname,Score::index scor)
{
    if(stuMap.count(sname))
    {
        stuMap[sname].insertScore(scor);
        return true;
    }
    else
    {
        stuMap.insert(std::make_pair(sname,Score(scor)));
        return true;
    }
}

bool Manager::add(const std::string &sname,Score::scMap &sCore)
{
    if(stuMap.count(sname))
    {
        std::cout<<sname<<"has existed"<<std::endl;
        return false;
    }
    else
    {
        stuMap.insert(std::make_pair(sname,sCore));
        return true;
    }
}

bool Manager::deleteStu(const std::string &sname)
{
    if(stuMap.erase(sname))
    {
        std::cout<<sname<<"has delelted"<<std::endl;
        return true;
    }
    else
    {
        std::cout<<sname<<"delete fail"<<std::endl;
        return false;
    }
}

bool Manager::deleteScore(const std::string &sname,const std::string &project)
{
    studentMap::iterator stu=stuMap.find(sname);
    if(stu!=stuMap.end())
    {
        return (stu->second).deleteSigleScore(project);
    }
    else
    {
        return false;
    }
}

bool Manager::updateName(const std::string &oldName,const std::string &newName)
{
    studentMap::iterator iter=stuMap.find(oldName);
    if(iter!=stuMap.end())
    {
        add(newName,iter->second.scoreMap);
        return true;
    }
    else
    {
        std::cout<<oldName<<"did not existed"<<std::endl;
        return false;
    }
}

bool Manager::updateScore(const std::string &stuName,const std::string &projName,double newScore)
{
    studentMap::iterator iter=stuMap.find(stuName);
    if(iter!=stuMap.end())
    {
        iter->second.updateScore(projName,newScore);
        return true;
    }
    else
        return false;
}

double Manager::querySingleScore(const std::string &sname,const std::string &proj)
{
    studentMap::iterator iter=stuMap.find(sname);
    /*if(iter!=stuMap.end())
    {*/
        double newScor=iter->second.requeryScore(proj);
        return newScor;
    /*}*/ 
}

std::map<std::string,double> Manager::queryAllScore(const std::string &sname)
{
    studentMap::iterator iter=stuMap.find(sname);
    return iter->second.scoreMap;
}

主程序:

#include "stdafx.h"
#include "Manager.h"
#include <iostream>
#include <map>
#include <utility>

static enum choice
{
    Query,
    Delete,
    Update,
    Add
};

Manager manager;

void queryN()
{
    std::cout<<"*******************"<<std::endl;
    std::cout<<"Please enter the name you want to query:"<<std::endl;
    std::string studentName,projectName;
    if(std::cin>>studentName)
    {
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the project name you want to query"<<std::endl;
        while(std::cin>>projectName)
        {
            double tempScore=manager.querySingleScore(studentName,projectName);
            std::cout<<studentName<<"'s "<<projectName<<"is "<<tempScore<<std::endl;
        }
    }
    std::cin.clear();
}

void cmdDelete()
{
    //delete student
    std::cout<<"*******************"<<std::endl;
    std::cout<<"What's info do you want to delete ?(0:Student,1:Student's score)"<<std::endl;
    int i;
    std::string nameDele,projDele;
    std::cin>>i;
    switch(i)
    {
    case 0:
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the name the student you want to delete"<<std::endl;
        while(std::cin>>nameDele)
        {
            if(manager.deleteStu(nameDele))
                std::cout<<nameDele<<"deleted"<<std::endl;
            else
                std::cout<<nameDele<<"deleted fail"<<std::endl;
        }
        break;
    case 1:
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the name the student you want to delete"<<std::endl;
        while(std::cin>>nameDele)
        {
            std::cout<<"Please enter the project that you want to delete"<<std::endl;
            while(std::cin>>projDele)
            {
                if(manager.deleteScore(nameDele,projDele))
                    std::cout<<nameDele<<"'s"<<projDele<<"succeed"<<std::endl;
                else
                    std::cout<<nameDele<<"'s"<<projDele<<"fail"<<std::endl;
            }
        }
        break;
    }
    std::cin.clear();
}

void updateInfo()
{
    std::cout<<"*******************"<<std::endl;
    std::cout<<"Please enter what info do you want to update?(0:stdudent's name 1:score"<<std::endl;
    int i;
    std::string queryName,newName,projName;
    double newScore;
    std::cin>>i;
    switch(i)
    {
    case 0:
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the name you want to update"<<std::endl;
        std::cin>>queryName;
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter new name"<<std::endl;
        std::cin>>newName;
        if(manager.updateName(queryName,newName))
        {
            std::cout<<"*******************"<<std::endl;
            std::cout<<queryName<<" has changed to "<<newName<<std::endl;
        }
        else
        {
            std::cout<<"*******************"<<std::endl;
            std::cout<<"change fail"<<std::endl;
        }
        break;
    case 1:
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the name you want to update"<<std::endl;
        std::cin>>queryName;
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter project name you want to update"<<std::endl;
        std::cin>>projName;
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the new score "<<std::endl;
        std::cin>>newScore;
        if(manager.updateScore(queryName,projName,newScore))
        {
            std::cout<<"*******************"<<std::endl;
            std::cout<<queryName<<"'s"<<projName<<" has changed to "<<newScore<<std::endl;
        }
        else
        {
            std::cout<<"*******************"<<std::endl;
            std::cout<<"change fail"<<std::endl;
        }
        break;
    }
    std::cin.clear();
}

void cmdAdd()
{
    std::string newName,newProj;
    double newScore;
    do{
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the new name,enter 'q' to finish"<<std::endl;
        std::cin>>newName;
        std::cout<<"*******************"<<std::endl;
        std::cout<<"Please enter the new project"<<std::endl;
        while(std::cin>>newProj)
        {
            std::cout<<"*******************"<<std::endl;
            std::cout<<"Please enter the new score"<<std::endl;
            if(std::cin>>newScore)
            {
                manager.add(newName,std::make_pair(newProj,newScore));
            }
        }
    }while(std::cin&&newName!="q");
}

int _tmain(int argc, _TCHAR* argv[])
{
    int choiceInt;
    do{
    std::cout<<"Please choose the function you want to do:"<<std::endl;
    std::cout<<"*******************"<<std::endl;
    std::cout<<"0:Query"<<std::endl<<"1:Delete"<<std::endl<<"2:Update"<<std::endl<<"3:Add"<<std::endl;

    std::cin>>choiceInt;

        switch(choiceInt)
    {
    case 0:
        queryN();
        std::cin.clear();
        break;
    case 1:
        cmdDelete();
        std::cin.clear();
        break;
    case 2:
        updateInfo();
        std::cin.clear();
        break;
    case 3:
        cmdAdd();
        std::cin.clear();
        break;
    }
    }while(std::cin);
    return 0;
  }

    我是把Manager的数据成员定义成string-Score的Map容器,但是我想把Score设为私有类只有Manager类可访问,这样Score就不能作为容器的元素,设为指针?也不行啊。大神可以指导一下么?(思路其实不是很清晰~所以代码会有些冗余且乱,我会继续努力的!)

共2条回复
tinyfool 回复于 2015年12月22日

用来理解一个简单概念,比如私有类的Demo,尽量做简单一点

为什么你会用struct来定义类?

莫非你看的是非常古老的C++教材?

用class定义就是私有的,struct就是全部公有的,如果我没有记错的话

Fancy 回复于 2015年12月22日

1楼 @tinyfool 我知道struct与class的唯一差别就是成员的默认访问级别。

可是如果用class定义score类,会提示pair不可访问score类,把pair类设为友元也失败~所以就把它改成了struct。。

可能整体设计的就不合理~

另外,我看的是c++ primer 4th,是有点老~

登录 或者 注册