我正在为我的夏季OO班做一个家庭作业,我们需要写两个班。一个称为Sale
,另一个称为Register
。我写了Sale
课;这是.h
文件:
enum ItemType {BOOK, DVD, SOFTWARE, CREDIT};
class Sale
{
public:
Sale(); // default constructor,
// sets numerical member data to 0
void MakeSale(ItemType x, double amt);
ItemType Item(); // Returns the type of item in the sale
double Price(); // Returns the price of the sale
double Tax(); // Returns the amount of tax on the sale
double Total(); // Returns the total price of the sale
void Display(); // outputs sale info
private:
double price; // price of item or amount of credit
double tax; // amount of sales tax
double total; // final price once tax is added in.
ItemType item; // transaction type
};
对于Register
类,我们需要在成员数据中包含动态数组的Sale
个对象。
所以我的两个问题是:
Sale
班级继承到我的Register
班级(如果是,如何)?编辑:我们不能使用矢量。
答案 0 :(得分:3)
不需要继承。一般例子:
std::vector<Sale> sales;
得爱模板。
答案 1 :(得分:2)
不,在这种情况下,继承是不合适的。您可能希望将销售数量和数组大小作为Register
类中的字段进行跟踪。类定义将包括此
class Register{
private:
int numSales;
int arraySize;
Sale* sales;
public:
Register();
~Register();
void MakeSale(Sale);
};
Register::Register(){
numSales = 0;
arraySize = 5;
sales = new Sale[arraySize];
}
void Register::MakeSale(Sale s){
if(numSales == arraySize){
arraySize += 5;
Sale * tempArray = new Sale[arraySize];
memcpy(tempArray, sales, numSales * sizeof(Sale));
delete [] sales;
sales = tempArray;
}
sales[numSales] = s;
++numSales;
}
Register::~Register()
{
delete [] sales;
}
这不包括边界检查或您在进行销售时需要做的其他事情,但希望这会有所帮助。
答案 2 :(得分:0)
如果您不能使用矢量,那么您可以使用std::list
。你真的应该尽可能地使用标准容器 - 任何家用轧制解决方案都可能是劣质产品。标准库经过了广泛的优化和测试 - 当您有更好的事情要做而不是重新发明轮子时,您是否真的觉得需要进行相同的投资?
std::list
不应分配超出必要的空间。但是,它有一些严重的局限性。矢量和其他形式的动态数组是连续的这一事实提供了很大的性能优势。
无法使用向量似乎是一个非常随意的限制。他们分配的空间超出必要的空间是一个特征,而不是一个bug。它允许容器分摊重新分配中涉及的昂贵副本和/或移动操作。智能矢量实现应该检查低内存情况并优雅地处理它们。如果没有,您应该向标准库实现提交补丁或转移到新的补丁。但是施加任意约束而没有解释,例如:
此阵列中不应有超过5个未使用的插槽(即 分配的空间数量最多可以比数量大5 实际填充实际数据的插槽。)
是不好的做法。五号的来源是从哪里来的?它甚至不是两个人的力量!如果你想使用std::vector::reserve
破解这个限制,这可能是你最好的选择。但是,所有这些簿记都不应该被完成。
而且,与其他人一致:继承不是你想要的。