如何在C ++中使用一个类创建多个项目?

时间:2012-03-19 10:55:00

标签: c++ oop class methods

我有班级家具:

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很陌生,我想学习一些好的做法。

感谢。

5 个答案:

答案 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方法获取家具项目。