Объявление массива внутри класса. C ++ - PullRequest
0 голосов
/ 18 октября 2019

Я хочу создать класс, который инициализирует массив, и функцию push, которая добавляет элемент в массив, а не печатает его. Как новичок, я знаю, что что-то не так с инициализацией, все работает нормально, кроме функции push, она не печатает массив. Что не так с моим классом?

#include <iostream>

class pile{
    public :
    int n;
    int p[]={};
    pile(int m){
        n=m;
        std::cout<<"Contructor is up .. ";
    }

    int init(int n){
        int z=n-1;
        for(int i;i<=z;i++){
            std::cin>>p[i];
        }
    }

    int push(int n, int x){
        int y=n-1;
        int p[]={};
        p[n]=x;
        for(int u=0;u<=n;u++){
            std::cout<<p[u]<<" ";
        }
    }


};

int main(){
    int a;
    std::cout<<"How many integers does your array got ?  >> ";
    std::cin>>a;

    pile p1(a);
    std::cout<<"\nEnter your array's integers >> ";
    p1.init(a);
    int j;
    std::cout<<"\nInteger that you want to add to the array ? >> ";
    std::cin>>j;
    std::cout<<"\nThe new array is >> ";
    p1.push(a,j);

    return 0;
}

Ответы [ 2 ]

6 голосов
/ 18 октября 2019

Я хочу создать класс, который инициализирует массив,

Пример класса с членом массива со значением инициализации:

struct foo {
    int member[10] = {};
};

Что не так с моим классом?

Это неправильно:

int p[]={};

Во-первых, элемент не может быть массивом неопределенной длины, даже если онимеет инициализатор. Во-вторых, ни одна переменная не может быть массивом нулевой длины.

и функция push, которая добавляет элемент в массив, чем печатает его

Невозможно добавить элементыв массив. Массив имеет постоянное количество элементов на протяжении всего времени его жизни.

Вероятно, вам нужна структура данных, которая динамически выделяет массив и копирует элементы в новый, больший массив при добавлении большего количества элементов. В структуре данных есть нечто большее, чем это краткое описание. Существует стандартный контейнер, который реализует структуру данных «массив с изменяемым размером»: std::vector.

1 голос
/ 18 октября 2019

Так что иногда лучше работать с памятью, поэтому ваш код может выглядеть следующим образом:

#include <iostream>
using namespace std; // std:: namespace usage is not needed after that

class pile{

    int n; // it's a not best practice to declare this as public
    int* p; // better way to hide this fields include them in to private

public :

    pile(int m){
        n=m;
        p = new int[n];
        cout<<"Constructor is up .. ";
    }
    ~pile(){
      if(p != nullptr){
        delete p;
      }
    }

    void init(int n){
        for(int i = 0;i < n; i++){
            cin>>p[i];
        }
    }

    int push(int j, int x){
        int oldValue = p[j];
        if(j >= 0 && j < n) { // this checking is necessary
          p[j]=x;
        } else if (j == n) {
          // you need to reset memory
          // there are different ways to do that, for example
          int* q = new int[n + 1];
          int i = 0;
          for(; i < n; i++) {
            q[i] = p[i];
          }
          q[i] = x;
          delete p;
          p = q;
          n++;
        }
        // you are forget the return statement
        return oldValue;
    }

    friend ostream& operator<<(ostream& os, const pile& pil);
};

// it's most common way to use standard output to draw your class content
ostream& operator<<(ostream& os, const pile& pil) {
  for(int i = 0; i < pil.n; i++){
    os << pil.p[i] << " ";
  }
  return os;
};
// also you may override >> operator to swap your init fun.

int main(){
    int a;
    cout<<"How many integers does your array got ?  >> ";
    cin>>a;

    pile p1(a);
    cout<<"\nEnter your array's integers >> ";
    p1.init(a);
    int j;
    cout<<"\nInteger that you want to add to the array ? >> ";
    cin>>j;
    p1.push(a,j);
    cout<<"\nThe new array is >> ";
    cout << p1 << endl; // looks very nice for now

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