доступ к массиву через указатель - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел создать базу данных, подобную классу, через ООП.В этом классе есть 3 массива, которые действуют как столбцы в таблице. Я вставляю данные через insert() function и печатает данные через printEntries() function.Но эта функция не может получить доступ к массивам для получения данных.

#include <iostream>
#include <sstream>
#include <fstream>
#include <string> 
using namespace std;

class subject{

   public:
      int numOfStudents;
      string subjectId;
      int * marksArray;
      int * indexArray;
      char * gradeArray;
      int index ; // index for inserting data

      subject(int students , string subjectName){

      numOfStudents = students;
      subjectId = subjectName;
      this->index =0 ;
      //creating and pointing to arrays
      int  A[numOfStudents];      marksArray = A;
      int  B[numOfStudents];      indexArray = B;
      char C[numOfStudents];      gradeArray = C;

  }

 void insert(int studentId , int mark , char grade){
 indexArray[index] = studentId;
 marksArray[index] = mark;
 gradeArray[index] = grade; 

 this->index = this->index +1;    
}

int getNumberOfEntries(){
    return index ;
}

 void printEntries(){
        cout<< indexArray[0] << "  O" << marksArray[0] << "  " << gradeArray[0] << endl; 
        cout<< indexArray[1] << "  OOO" << marksArray[1] << "  " << gradeArray[1] << endl; 
        cout<< indexArray[2] << "  OO" << marksArray[2] << "  " << gradeArray[2] << endl;  
      }
  };

 int main(int argc, char const *argv[]){ 
  subject S(10,"Mathematics");
  cout<<S.subjectId<<endl;
  cout<<S.numOfStudents<<endl;
  S.insert(35,34,'A');
  S.insert(33,34,'B');
  S.insert(54,34,'C');
  S.insert(21,34,'D');
  S.insert(14,34,'F');
  S.printEntries();
  return 0;
 }

вывод:

Математика 10 35 O34 A 0 OOO0

1 Ответ

0 голосов
/ 20 ноября 2018

Как отметил @paddy в комментариях к вашему вопросу, ваша проблема находится в конструкторе.

//creating and pointing to arrays
int  A[numOfStudents];      marksArray = A;
int  B[numOfStudents];      indexArray = B;
char C[numOfStudents];      gradeArray = C;

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

Замена указателей на std::vectors и вставка элементов там будут обязательнопроще.

class subject
{
public: // It's considered bad practive to have public data members in a class
  std::vector<int> marksVector;
  std::vector<int> indexVector;
  std::vector<char> gradeVector;
  // ...

  void insert(int studentId , int mark , char grade){
     indexVector.push_back(studentId);
     marksVector.push_back(mark);
     gradeVector.push_back(grade);

     // No longer need to worry about index for next insert
  }
};
...