2016-09-28 4 views
-2

Довольно новичок в C++ здесь и программирование в целом, поэтому, пожалуйста, будьте терпеливы и понимаете, что мои объяснения могут не совпадать. Назначение для моего класса ООП вызывает следующее:C++ OOP Классы и конструкторы

Создайте класс инвентаризации, который может хранить информацию о товаре в инвентаре розничного магазина. Необходимые частные переменные-члены: - номер позиции - количество - стоимость Требуемые функции-члены

Конструктор по умолчанию - Устанавливает все переменные члены 0 Конструктор # 2 - Принимает элемента номер, количество и стоимость в качестве аргументов , Вызывает другие функции класса, чтобы скопировать эти значения в соответствующие переменные-члены.

Они, как я это делаю, несколько отличаются. Вместо 1 значения я пытаюсь инициализировать массив и хранить все значения, вводимые пользователем там. Однако кажется, что, как только пользователь выходит из функции member/class, значение удаляется из массива.

Вид на мой ум заканчивается здесь, поэтому любая информация или рекомендации очень помогут.

#include <iostream> 
using namespace std; 

class inventory 
{ 
    private: 
     int productNum[10]; 
     int productCount[10]; 
     double productPrice[10]; 
     int inventoryFillLevel; 
     int userPNumber; 
     int userQuantity; 
     double userPrice; 
    public: 
     inventory() 
     { 
      int counter = 0; 
      userPNumber = 0; 
      userQuantity = 0; 
      userPrice = 0; 
      while (counter < 10) 
      { 
       productNum[counter] = 5; 
       productCount[counter] = 6; 
       productPrice[counter] = 7; 
       counter++; 
      } 
     } 
     inventory(int pNumber, int pCount, int pPrice) 
     { 
      cout << "Now we're in the 2nd constructor in the Class" << endl; 
      cout << "The 1st number entered by the user is: " << pNumber << endl; 
      cout << "The 2nd number entered by the user is: " << pCount << endl; 
      cout << "The 3rd number entered by the user is: " << pPrice << endl; 
      Input(pNumber); 
     } 
     void Input(int pNumber) 
     { 
      int counter = 0; 
      cout << "\nNow we're in the function as called by the Constructor." << endl; 
      cout << "The 1st number entered by the user is: " << pNumber << endl; 
      cout << "In the function the counter is: " << counter << endl; 
      cout << "The value in the array at " << counter << " is: " << productNum[counter] << endl; 
      cout << "Now we set that to the value entered by the user" << endl; 
      productNum[counter] = pNumber; 
      cout << "And now the value in the array is: " << productNum[counter] << endl; 
     } 
     void Show() 
     { 
      int counter = 0; 
      cout << "After entering the value, let's check what is stored in the array: "; 
      cout << productNum[counter] << endl; 
     } 
}; 

int main() 
{ 

    int a=0; 
    int b=0; 
    int c=0; 

    inventory inv1; 

    cout << "1st User entered value" << endl; 
    cin >> a; 
    cout << "2nd User entered value" << endl; 
    cin >> b; 
    cout << "3rd User entered value" << endl; 
    cin >> c; 

    cout << "Now we call the 2nd constructor and pass the values to it" << endl; 
    inventory(a, b, c); 

    inv1.Show();  

    return 0; 

} 

Еще раз спасибо за помощь.

ответ

1

Ты видишь неправильно обрабатывать свой класс. Линия

inventory(a, b, c); 

только создает временный экземпляр inventory, который ушел по существу после того, как линия завершает выполнение. Поэтому, когда вы вызываете inv1.Show(), он по-прежнему использует значения, назначенные в вашем конструкторе по умолчанию, когда объявлено inv1. Вы должны удалить текущую декларацию inv и изменить

inventory(a, b, c); 

в

inventory inv1(a, b, c); 
+0

Я думал, что это происходит. Я думаю, что это сводится к моему пониманию намерений конструкторов. Я хочу, чтобы один инициализировал массив и все значения с помощью 0, а затем вызывал другого в конструктор, чтобы заполнить тот же массив данными, которые, по-видимому, не являются тем, что они делают. В этом случае их следует рассматривать как предоставление пользователю двух вариантов. Либо создать пустой объект массива, либо создать и заполнить массив? Это больше на точке? – Zardoz

0

значение не получают удалены. В коде есть небольшой недостаток.

1) - Вы производите ошибку при создании объекта. Вы вызываете метод Show с объектом, созданным конструктором по умолчанию.

inventory inv1; 

.... 
inv1.Show(); 

Изменение декларации inv1 к inventory inv1(a, b, c); и вызова затем вызвать метод шоу.

Также inventory(a, b, c); создаст новый объект и не будет влиять inv1.

2) - Вы всегда сохраняете значения по индексу 0 массива-члена. Как вы объявляете int counter = 0 всякий раз, когда вы вызываете какой-либо метод/конструктор.

int counter ; a class member.

class inventory 
{ 
    private: 
     int counter; 
    public: 
     inventory():counter(0){....} 

    .... 
}; 

Он будет считать предметы, которые вы уже вносите в свой инвентарь. Хотя вам придется позаботиться о том, сколько предметов вы уже вложили. Альтернативный подход может быть вы можете использовать std::vector вместо int array.

Смежные вопросы