通过指针访问数组

时间:2018-11-20 04:08:56

标签: c++ class oop data-structures syntax-error

我想通过OOP创建类似class的数据库。在此类中,有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 :(得分:2)

正如@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
  }
};