Массив указателей на объект в C ++ - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь написать супер базовую программу, которая создает массив объектов класса Receipt. Класс включает int price, string good (name) и простую функцию, которая добавляет элемент в список. Я застрял, потому что каждый раз, когда я компилирую его, происходит сбой seg, прежде чем он попадает в функцию добавления, что означает, что что-то не так с моим конструктором по умолчанию.

Я все еще новичок в C ++, и указатели, вероятно, моя самая большая борьба. Я посмотрел в Интернете и на своих лекциях, пытаясь выяснить, что я делаю неправильно. Я чувствую, что это что-то маленькое, но я не могу понять это.

Вот моя программа:

#include <iostream>
#include <string>

using namespace std;

class Receipt {
private:
    int price;
    string good;
    Receipt* goods[500]; //partially filled array
public:
    Receipt();
    void add(string name, int cost);
    string getName();
    int getPrice();
    void setName(string name_in);
    void setPrice(int price_in);
    void displayList();
};

Receipt::Receipt()
{       
    for (int i=0; i < 500; i++)
    {
        goods[i]->setName("Empty");
        goods[i]->setPrice(-1);
    }
}

void Receipt::add(string name, int cost)
{
    int place=0;
    for (int i=0; i <500; i++)
    {
        if (goods[i]->getName()=="Empty" && goods[i]->getPrice()==-1)
        {
            place = i;
            break;
        }
    }
    goods[place]->setName(name);
    goods[place]->setPrice(cost);
}

int Receipt::getPrice()
{
    return price;
}

string Receipt::getName()
{
    return good;
}

void Receipt::setName(string name_in)
{
    good = name_in;
}

void Receipt::setPrice(int price_in)
{
    price = price_in;
}

void Receipt::displayList()
{
    //just displaying first item in list for debugging purposes
    cout << goods[0]->getName() << endl << goods[0]->getPrice();
}


int main()
{
    Receipt mine; //seg faults here 

    mine.add("banana", 50);
    mine.displayList();

    return 0;
}

1 Ответ

0 голосов
/ 07 мая 2018

ваш дизайн неверен, у вас есть массив Receipt внутри Receipt, поэтому, когда вы инициализируете объект, он создает 500, где каждый из них создает еще 500 бесконечно. Я думаю, что вы хотите создать что-то вроде этого вместо

#include <iostream>
#include <string>

using namespace std;

class Receipt {
private:
    int price;
    string good;

public:

    void setName(string name_in);
    void setPrice(int price_in);
    string getName();
    int getPrice();
};


class Receipts {
private:
    Receipt* goods[500]; //partially filled array
public:
    Receipts();

    void add(string name, int cost);
    void displayList();
};

Receipts::Receipts()
{

    for (int i = 0; i < 500; i++)
    {
        goods[i] = new Receipt();
        goods[i]->setName("Empty");
        goods[i]->setPrice(-1);
    }
}

void Receipts::add(string name, int cost)
{
    int place = 0;
    for (int i = 0; i <500; i++)
    {
        if (goods[i]->getName() == "Empty" && goods[i]->getPrice() == -1)
        {
            place = i;
            break;
        }
    }
    goods[place]->setName(name);
    goods[place]->setPrice(cost);
}

int Receipt::getPrice()
{
    return price;
}

string Receipt::getName()
{
    return good;
}

void Receipt::setName(string name_in)
{
    good = name_in;
}

void Receipt::setPrice(int price_in)
{
    price = price_in;
}

void Receipts::displayList()
{
    //just displaying first item in list for debugging purposes
    cout << goods[0]->getName() << endl << goods[0]->getPrice();
}


int main()
{
    Receipts mine; //seg faults here 

    mine.add("banana", 50);
    mine.displayList();

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