【问题标题】:Object-oriented Cost-calulation not working C++面向对象的成本计算不起作用 C++
【发布时间】:2017-01-09 12:22:47
【问题描述】:

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

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

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

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

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

但是,如果我现在将 Club 2 添加为 Club 1 的分支,则计算仍然与没有 Club 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;
    }

Society.cpp 在 Society.h 中是类 Society : public Members

#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;
     }
 }

感谢您的帮助

【问题讨论】:

  • 在什么意义上它不起作用?你是如何添加成员的?你能指望什么?你得到了什么?您能否提供一个 较小的 完整示例(即带有主 fn)来演示该问题?
  • 这不是调试服务:您发布的内容可能是一个工作示例,但肯定不是最小的。请提供MCVE
  • 它不是用来调试程序正在工作的。但是,如果我添加一个俱乐部,什么不起作用。社会测试->新社会;然后添加一些成员,成本计算是正确的。但是,如果我创建一个新社团,然后将其作为子分支添加到社团中,则只会为其他成员计算成本,而不会为刚刚包含的社团计算成本,从而导致错误的结果。俱乐部 1:成员:Franz、John、Mark -> 计算正确。俱乐部 2:成员:Jakob -> 计算正确。俱乐部 1:成员:弗朗茨、约翰、马克、俱乐部 2 --> 计算不再正确
  • @MatthiasKPrime:提供a MCVE 否则没人会理会你的问题。对不起,如果这看起来很苛刻,但这就是事实
  • 我尝试将其更改为一个非常紧凑的问题。希望现在更清楚

标签: c++ oop recursion


【解决方案1】:

在某种程度上,这是在黑暗中的狂野刺,但您在 Society 类中有一个 std::vector&lt;Members&gt; 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&lt;std::shared_ptr&lt;Members&gt;&gt;

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2020-04-28
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多