Как я могу создать несколько элементов с одним классом в C ++? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть класс Мебель с:

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. Есть ли способ сделать это?

Кроме того, мой код в порядке? Я имею в виду, как я могу улучшить это? Я совсем новичок в ООП, и я хотел бы изучить некоторые хорошие практики.

Спасибо.

Ответы [ 5 ]

4 голосов
/ 19 марта 2012

Идея концептуально нарушена. Тебе этого не сделать; вам действительно нужны разные предметы.

В качестве альтернативы, если вы действительно хотите иметь несколько идентичных элементов, вы можете создать один элемент и создать несколько указателей на него, а также поддерживать отдельный счетчик для количества активных элементов. A shared_ptr делает это, например.

Тем не менее, ваш код вообще не должен использовать указатели, это распространенный анти-паттерн в коде C ++. Кроме того, ваш код, вероятно, не должен иметь сеттеров, вместо этого предоставьте правильный конструктор:

int main() {
    Furniture model("FinalDestiny", 149.99);
    model.printSpecs();
}

Значительно короче, проще и нет возможности утечки памяти.

2 голосов
/ 19 марта 2012

Я бы написал так

#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) вы забываете const при получении ...

2 голосов
/ 19 марта 2012

Чтобы отслеживать количество элементов, вы можете обновить количество элементов в конструкторе:

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];
0 голосов
/ 19 марта 2012

Храните экземпляры мебели в массиве или лучше в vector.Вы можете получить к ним доступ с помощью индекса или итератора.Поле NumberOfItems не принадлежит классу мебели, экземпляр мебели не должен знать о количестве предметов мебели в системе.Используйте метод size () из vector, чтобы получить количество предметов мебели.

0 голосов
/ 19 марта 2012

Просто увеличьте NumberOfItems в конструкторе и уменьшите его в деструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...