我有班级家具:
Furniture.h:
#include <iostream>
#include <string>
using namespace std;
class Furniture {
public:
Furniture();
~Furniture();
void setname(string name);
void setprice(double price);
double getprice();
string getname();
virtual void printSpecs();
private:
string name;
double price;
protected:
static int NumberOfItems;
int Id;
};
furniture.cpp:
#include "furniture.h"
Furniture::Furniture() {
}
Furniture::~Furniture() {
}
void Furniture::setname(string name) {
this->name = name;
}
string Furniture::getname()
{
return this->name;
}
void Furniture::setprice(double price) {
this->price = price;
}
double Furniture::getprice() {
return this->price;
}
void Furniture::printSpecs() {
cout<<"Price: "<<this->price<<endl;
cout<<"Name: "<<this->name<<endl;
}
int main() {
Furniture *model = new Furniture();
model->setname("FinalDestiny");
model->setprice(149.99);
model->printSpecs();
delete model;
}
一切正常但我想添加多个具有相同类的家具项目,只需更新NumberOfItems。有没有办法做到这一点?
另外,我的代码好吗?我的意思是,我该如何改进呢?我对OOP很陌生,我想学习一些好的做法。
感谢。
答案 0 :(得分:4)
这个想法在概念上被打破了。你不能这样做;你真的需要不同的物品。
或者,如果您确实想拥有多个相同的项目,则可以创建一个项目并创建多个指针,并为活动项目的数量维护单独的计数。例如,shared_ptr
可以做到这一点。
也就是说,你的代码根本不应该使用指针,这是C ++代码中常见的反模式。此外,您的代码可能不应该有setter,而是提供适当的构造函数:
int main() {
Furniture model("FinalDestiny", 149.99);
model.printSpecs();
}
更短,更简单,也没有泄漏记忆的可能性。
答案 1 :(得分:2)
要跟踪项目数,您可以更新构造函数中的项目数:
Furniture::Furniture() {
Id = NumberOfItems++;
}
如果你想要并在析构函数中减少:
Furniture::~Furniture() {
NumberOfItems--;
}
要按Id
访问该项目,您需要有一个额外的经理类或使用地图:
std::map<int,Furniture*> items;
您可以将其作为参数传递给构造函数并在那里更新:
Furniture::Furniture(std::map& items) {
Id = NumberOfItems++;
items[Id] = this;
}
而且,在外面,你可以简单地检索项目:
Furniture* f = items[3];
答案 2 :(得分:2)
我会这样写
#include <iostream>
#include <string>
using namespace std;
class Furniture {
public:
Furniture(string name = "", double price = 0)
: name(name), price(price), Id(NumberOfItems++)
{}
Furniture(const Furniture &f)
: name(f.getname()), price(f.getprice()), Id(NumberOfItems++)
{}
void setname(string name) { this->name = name; }
void setprice(double price) { this->price = price; }
double getprice() const { return price; }
string getname() const { return name; }
virtual void printSpecs() {}
private:
string name;
double price;
protected:
static int NumberOfItems;
int Id;
};
int Furniture::NumberOfItems;
int main_furniture(int, char **)
{
Furniture a("product 1", 100);
Furniture x(a), y(a), z(a);
}
我只是为了简化而内联。有趣的是你应该是复制构造函数实现,并且(OT)你忘记了getter上的 const ......
答案 3 :(得分:0)
只需在构造函数中递增NumberOfItems
,然后在析构函数中递减它。
答案 4 :(得分:0)
将家具实例存储在数组中,或更好地存储在vector
中。您可以使用索引或迭代器访问它们。 NumberOfItems字段不属于家具类,家具实例不应该知道系统中有多少家具。使用size ()
中的vector
方法获取家具项目。