Извлечение данных из вектора из свежего экземпляра возвращает 0 - PullRequest
0 голосов
/ 30 мая 2018

Я создаю экземпляр после обновления записей до вектора vecData внутри counter.cpp, когда я пытаюсь получить эти данные, я получаю значение как 0

main.cpp

#include <iostream>
#include "counter.hpp"
#define MAX_PORTS 3

int main()
{
  Counter *counter = new Counter(3);
  counter->age = 1;
  counter->id = 12;
  counter->pincode = 123;

  std::vector<Counter> counterData(MAX_PORTS);

  counter->storeCounterData(counter,1);
  counter->storeCounterData(counter,2);
  counter->storeCounterData(counter,3);

  counter->getCounterData(counterData);

  // getCounterData here is not able to retrieve value updated in above vector `vecData`

  Counter *count = new Counter(3);
  count->getCounterData(counterData);
  return 0;
}

counter.cpp

#include "counter.hpp"
#include <iostream>
#include <vector>

Counter::Counter()
{  
}

Counter::Counter(int vecSize):vecData(vecSize)
{    
}

void Counter::storeCounterData(Counter *counter,int user)
{
  vecData[user].age = counter->age;
  vecData[user].id = counter->id;
  vecData[user].pincode = counter->pincode;

  std::cout<<"vector size inside storeCounterData = "<<vecData.size()<<std::endl;
}

void Counter::getCounterData(std::vector<Counter> &counter)
{
  counter = vecData;
  std::cout<<"vector size inside getCounterData = "<<vecData.size()<<std::endl;
  std::vector<Counter>::iterator it;

  for( it = vecData.begin(); it != vecData.end(); ++it)
  {
    std::cout<<vecData[1].age<<std::endl;
    std::cout<<vecData[1].id<<std::endl;
    std::cout<<vecData[1].pincode<<std::endl;
  }
}

counter.hpp

#include <vector>
class Counter
{
private:
std::vector<Counter> vecData; // vectors

public:
Counter();
Counter(int vecSize);
int age, id, pincode;
void storeCounterData(Counter *counter,int user);
void getCounterData(std::vector<Counter> &counter);

};

Выход

. / A.out векторный размер внутри storeCounterData =3

векторный размер внутри storeCounterData = 3

векторный размер внутри storeCounterData = 3

векторный размер внутри getCounterData = 3

1 12 123

1 12 123

1 12 123

векторный размер внутри getCounterData = 3

0 0 0

0 0 0

0 0 0

1 Ответ

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

Это C ++, не используйте макросы для констант:

#define MAX_PORTS 3

Вместо этого используйте переменную const:

const int max_ports = 3;

Почему вы создаете эту переменную в куче?

  Counter *counter = new Counter(3);
  counter->age = 1;
  counter->id = 12;
  counter->pincode = 123;

C ++ - это не Java или C #, не делайте этого.Вы не можете delete эти переменные, поэтому вы теряете память.Не делай этого.Это правильный путь:

  Counter counter(3);
  counter.age = 1;
  counter.id = 12;
  counter.pincode = 123;

Затем либо измените setCounterData, чтобы получить ссылку, либо передайте адрес объекта:

  counter->storeCounterData(&counter,1);

Вы индексируете в векторесо значениями 1, 2 и 3, но вектор имеет только три элемента, поэтому правильные индексы: 0, 1 и 2.Выполнение vecData[user], когда user==3 и vecData.size()==3 - серьезная ошибка.Не делайте этого.

Почему вы всегда используете vecData[1] вместо использования итератора?

  std::vector<Counter>::iterator it;

  for( it = vecData.begin(); it != vecData.end(); ++it)
  {
    std::cout<<vecData[1].age<<std::endl;
    std::cout<<vecData[1].id<<std::endl;
    std::cout<<vecData[1].pincode<<std::endl;
  }

Вы, вероятно, имели в виду это:

  std::vector<Counter>::iterator it;

  for( it = vecData.begin(); it != vecData.end(); ++it)
  {
    std::cout<<it->age<<std::endl;
    std::cout<<it->id<<std::endl;
    std::cout<<it->pincode<<std::endl;
  }

Илинамного проще:

  for (auto& c : vecData)
  {
    std::cout << c.age << std::endl;
    std::cout << c.id << std::endl;
    std::cout << c.pincode << std::endl;
  }

(и обратите внимание, насколько проще читать это с пробелами вокруг операторов <<).

, когда я пытаюсь получить эти данныеЯ получаю значение как 0

Причина, по которой вы всегда печатаете 0, заключается в том, что вы получаете данные из незаполненного вектора, который содержит только три новых объекта Counter:

  Counter *count = new Counter(3);
  count->getCounterData(counterData);

Вы не сохранили никаких значений в count->vecData[1], поэтому распечатанные значения являются просто значениями по умолчанию, созданными конструктором Counter, который не может инициализировать свои элементы:

Counter::Counter()
{  
}

Это означает, что переменные-члены являются просто мусором.Вы получаете нули, потому что ваша программа только что запустилась, поэтому куча оказывается заполненной нулями, но на самом деле это неопределенное поведение для чтения этих переменных.

Ваш класс Counter должен правильно инициализировать эти члены:

class Counter
{
private:
    std::vector<Counter> vecData; // vectors

public:
    Counter();
    Counter(int vecSize);
    int age = 0;
    int id = 0;
    int pincode = 0;
    void storeCounterData(Counter *counter,int user);
    void getCounterData(std::vector<Counter> &counter);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...