c++ - 怎样可以使Score变为私有类?
天蓬老师
天蓬老师 2017-04-17 13:15:33
[C++讨论组]

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

#include 
#include 
#include 
#ifndef SCORE_H
#define SCORE_H

struct Score
{
    friend class Manager;
    typedef std::map scMap;
    typedef std::map::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!"< scoreMap;
};
#endif

Score.cpp

#include "StdAfx.h"
#include 
#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 "<

Manager.h

#pragma once
#include 
#include 
#include 
#include "Score.h"

#ifndef MANAGER_H
#define MANAGER_H

class Manager
{
    typedef std::map 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 queryAllScore(const std::string &);
    
private:
    std::map stuMap;
};
#endif

Manager.cpp

#include "StdAfx.h"
#include "Manager.h"
#include 
#include 
#include 
#include 

bool Manager::add(const std::string &sname)
{
    if(stuMap.count(sname))
    {
        std::cout< 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<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<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 Manager::queryAllScore(const std::string &sname)
{
    studentMap::iterator iter=stuMap.find(sname);
    return iter->second.scoreMap;
}

主程序

#include "stdafx.h"
#include "Manager.h"
#include 
#include 
#include 

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

Manager manager;

void queryN()
{
    std::cout<<"*******************"<>studentName)
    {
        std::cout<<"*******************"<>projectName)
        {
            double tempScore=manager.querySingleScore(studentName,projectName);
            std::cout<>i;
    switch(i)
    {
    case 0:
        std::cout<<"*******************"<>nameDele)
        {
            if(manager.deleteStu(nameDele))
                std::cout<>nameDele)
        {
            std::cout<<"Please enter the project that you want to delete"<>projDele)
            {
                if(manager.deleteScore(nameDele,projDele))
                    std::cout<>i;
    switch(i)
    {
    case 0:
        std::cout<<"*******************"<>queryName;
        std::cout<<"*******************"<>newName;
        if(manager.updateName(queryName,newName))
        {
            std::cout<<"*******************"<>queryName;
        std::cout<<"*******************"<>projName;
        std::cout<<"*******************"<>newScore;
        if(manager.updateScore(queryName,projName,newScore))
        {
            std::cout<<"*******************"<>newName;
        std::cout<<"*******************"<>newProj)
        {
            std::cout<<"*******************"<>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:"<>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)
迷茫

把Score类的声明作为private成员放在Manager类的声明里:

//Manager.h
class Manager{
public:
    //some public declarations
private:
    class Score{
    public:
    //public members
    private:
    //private members go here
    };
    //std::map<std::string, Score*> someMap;
    typedef std::shared_ptr<Score> ScorePtr;
    std::map<std::string, ScorePtr> anotherMap;
};

这样你的Manager类里的Score类就是私有的,当别人试图实例化一个Score编译器会报错:

Manager::Score score;//error, class Manager::Score is private

然后每次需要对这个Map进行insert的时候,你用std::make_shared<Score>包上一层传进去。

PHP中文网

你把Score类挪到Manager类里面不就完了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号