面向对象 成本计算C++不起作用

Object-oriented Cost-calulation not working C++

本文关键字:不起作用 C++ 成本计算 面向对象      更新时间:2023-10-16

我目前正在编写一个体育管理软件。您可以将俱乐部和成员添加到这些俱乐部中,但您也可以将子俱乐部添加到俱乐部本身。

问题:如果我创建一个新社团并添加新成员,则成本计算有效。

俱乐部 1:会员 1、会员 2、会员 3 -->成本计算正确

如果我现在添加第二个俱乐部,该俱乐部的成本计算也是正确的。

俱乐部2:会员5,会员6。 -->成本计算正确

但是,如果我现在将俱乐部 2 添加为俱乐部 1 的分支,则计算结果仍然与没有俱乐部 2 分支的计算相同

俱乐部 1:会员 1、会员 2

、会员 3、俱乐部 2 ->计算不正确。

我真的很感激你的帮助。下面是我的代码。

成员.cpp

#include <iostream>
#include <string>
#include "Members.h"
static int memberid = 0;

    Members::Members() 
    {
        this->name = "default"; 
        this->id = memberid++;
    }
    Members::Members(std::string name)
    {
        this -> name = name; 
        this->id = memberid++; 
    }
    Members::~Members()
    {
    }
    void Members::setname(std::string newname)
    {
        this -> name = newname;
    }
    std::string Members::getName()
    {
        return this->name;
    }
    int Members::getID()
    {
        return this->id;
    }
    double Members::getIncome()
    {
        return this->income;
    }
    void Members::setIncome(double income)
    {
        this->income = income; 
    }
    double Members::getCosts()
    {
        return this->costs;
    }
    void Members::setCosts(double costs)
    {
        this->costs = costs; 
    }
    double Members::getSurplus()
    {
        return this->income - this->costs; 
    }
    std::string Members::toString()
    {
         std::string formated = " Member: " + getName() + "n Income: " + std::to_string(getIncome()) + "n Costs: " + std::to_string(getCosts()) + "n Surplus: " + std::to_string(getSurplus());
         return formated;
    }

社会.cpp在社会中是阶级 社会:公共成员

#include "Society.h"
#include "Membertypes.h"
#include <sstream>
#include <vector>
#include <algorithm>
Society::Society(std::string name, int maximalmembers)
{
     setname(name);
     setMax(maximalmembers);
     Members::setCosts(this->getCosts());
     Members::setIncome(this->getIncome());
}
double Society::getIncome()
{
    double income=0; 
    for (int i = 0, n = members.size(); i < n; i++)
    {
        income += members[i].getIncome();
    }
    return income;
}
double Society::getCosts()
{
    double costs=0; 
    for (int i = 0, n = members.size(); i < n; i++)
    {
        costs += members[i].getCosts();
    }
    return costs;
}
double Society::getSurplus()
{
    double surplus=0;
    for (int i = 0, n = members.size(); i < n; i++)
    {
        surplus += members[i].getSurplus();
    }
    return surplus;
}
void Society::addMember(Members* newMember)
{
     if ((int) members.size() < this -> maximalMembers)
     {
         this ->members.push_back(*newMember);
     }
     else
     {
         std::cout << "To many members" << std::endl;
     }
 }

感谢您的帮助

在某种程度上,这是在黑暗中疯狂的刺伤,但你在Society类中有一个std::vector<Members> members;

您已经将Members设计为多态类 - 您有虚函数,并且各种构造函数为每种类型设置了不同的成本等。

但是,当您将它们放入矢量中时,您只需将它们切片即可。

您的添加方法:

void Society::addMember(Members* newMember)
{
     if ((int) members.size() < this -> maximalMembers)
     {
         this ->members.push_back(*newMember);
     }
     else
     {
         std::cout << "To many members" << std::endl;
     }
 }

获取一个指针 - 这是一个潜在的内存泄漏 - 然后将其视为Member

请考虑改用std::vector<std::shared_ptr<Members>>