Consumption
类,它应该代表服务/线路的每月消费。
class Consumption
{
private:
Ligne* m_line;//the line related to this consumption
Service* m_service;//service used by this line
int m_month;
int m_year;
int m_units;//units of m_service used in the m_month of m_year
public:
//some getters and setters
double price();//returns m_units * the service's price/unit
};
每行最多可以使用2个服务
消费将用于为某一行开出账单
我的问题是,跟踪创建的消费的最佳方法是什么?我的意思是什么数据结构可能是最好的使用?我应该对班级做出任何改变吗?
请注意,我没有使用文件存储任何内容
任何帮助表示赞赏...
答案 0 :(得分:0)
以类似数组的方式存储内容并保持对任何元素的常量访问时间的最佳结构是向量。它就像你有动态大小的数组。
第二个选择是deque。如果您计划拥有非常多的数据,因为它有更好的存储管理,您可以从前面和后面编辑它,而不仅仅是向量中。
最后一个可能是列表。如果您计划对数据进行大幅度编辑,例如删除插入新元素(不仅仅是访问它们),您应该考虑这个,因为它在插入/删除元素时具有线性复杂性,而前2个具有线性加上额外的线性时间直到位置和结束之间的元素数量。
所以结论:
这些是STL序列容器,包括标题应该如下所示:
#include <vector>
here's reference for all STL containers
编辑: 我知道你的意思是别的,但我把它留在这里并添加它。
你真的需要消费阶层吗?我的意思是,如果你在Line类中保留关于line的所有数据,那将更合乎逻辑。这意味着如果需要,我会将每月使用的服务存储在向量中,或者我会立即计算价格并记住上个月的服务。我还会创建一个名为program的类,它将存储所使用的服务并让它处理正在使用的服务数量。如果已经有2个,它可以丢弃新服务,或者重写旧服务。您还可以使程序返回价格并将其乘以使用的时间。像这样:
#include <vector>
using namespace std;
class Service{
public:
int getPrice(){return monthPrice;}
void setPrice(const int &p) { monthPrice = p; }
private:
int monthPrice;
};
class Program{
public:
Program(){servicesUsed = 0; monthTime = 0;}
Program(const int &t) : monthTime(t) {servicesUsed = 0;}
void setTime(int t){monthTime = t;}
void addService(Service &s);
int price(); //calculate price of program
private:
int monthTime; //time that program was used
Service services[2]; //services used in program
int servicesUsed;
};
void Program::addService(Service &s){
if(servicesUsed < 2){ // Discarding solution
services[servicesUsed] = s;
servicesUsed++;
}
}
int Program::price(){
int pP = 0;
for(int i = 0; i < servicesUsed; i++){
pP += services[i].getPrice();
}
pP *= monthTime;
return pP;
}
class Line{
public:
Program *addMonth(const int &t); //will return handle for month
int consuption(); //calculate full line consuption
private:
vector<Program> monthList; //store data about services per month
};
Program *Line::addMonth(const int &t){
monthList.push_back(Program(t));
return &monthList.back();
}
int Line::consuption(){
int p = 0;
for(unsigned int i = 0; i < monthList.size(); i++){
p += monthList[i].price();
}
return p;
}
int main(){
//showcase
Program *handle;
Service s1,s2,s3;
s1.setPrice(50);
s2.setPrice(75);
s3.setPrice(100); //probably read from file
Line line;
handle = line.addMonth(30); // monthTime probably also from file
handle->addService(s1);
handle->addService(s2);
handle->addService(s3);
handle = line.addMonth(60);
handle->addService(s3);
handle->addService(s2);
int p = line.consuption();
return 0;
}
应该工作正常,你可能需要修改它;)
答案 1 :(得分:0)
您使用不好的方法来解决问题。
你说:什么结构最好解决(你的问题)
首先,必须对要保存的数据进行建模以及如何组织数据,我建议使用数据库设计中常用的Entity Relationship Model。
WHEN 您将图表返回到代码编辑器,以便在C ++中描述如何表示该模型。
然后,您将能够选择最适合您的数据结构。我建议看看STL,不是很漂亮,但效率很高,你不需要重新发明轮子:)