0

I need to write a class Stack using another template class Array for internal storage. This is the class Array, which was provided, so I assume I can't modify it:

#ifndef ARRAY_HH
#define ARRAY_HH

template <class A> 
class Array {
public:

  Array(int size, A val) : _size(size) {
    defval=val;
    _arr = new A[_size] ;
    for (int i=0; i<_size; i++){
      _arr[i]=val;
    }
  }


  Array(const Array& other) : _size(other._size) {
    _arr = new A[other._size] ;
    for (int i=0; i<other._size; i++){
      _arr[i]=other.defval;
    }

    // Copy elements
    for (int i=0 ; i<_size ; i++) {
      _arr[i] = other._arr[i] ;
    }
  }

  ~Array() {
    delete[] _arr ;
  }


  Array& operator=(const Array& other) 
  {
    if (&other==this) return *this ;
    if (_size != other._size) {
      resize(other._size) ;
    }
    for (int j=0; j<_size; j++){
      _arr[j]=other.defval;
    }
    for (int i=0 ; i<_size ; i++) {
      _arr[i] = other._arr[i] ;
    }
    return *this ;
  }

  A& operator[](int index) {
    if (index >_size){
      std::cout <<"Beyond range, resizing..." <<std::endl;
      resize(index+1);
      return _arr[index];
    }
    else{
      return _arr[index] ;
    }
  }
  const A& operator[](int index) const {
    return _arr[index] ;
  }

  int size() const { return _size ; }

  void resize(int newSize) {
    // Allocate new array
    A* newArr = new A[newSize] ;

    // Copy elements
    for (int i=0 ; i<_size ; i++) {
      newArr[i] = _arr[i] ;
    }
    for (int j=_size; j<newSize; j++) {
      newArr[j] = defval;
    }

    // Delete old array and install new one
    delete[] _arr ;
    _size = newSize ;
    _arr = newArr ;
  }


private:
  int _size ;
  A* _arr ;
  A defval;
} ;

#endif

Whereas this is the incomplete class Stack:

#ifndef STACK_H
#define STACK_H
#include <iostream>
#include "Array.hh"

class Stack {
  
  // Implementation
  private:
  int count;
  // Interface 
  public: 
  Array <double> s;

  Stack(){
    count=0;
  };
 
  int nitems() { return count ; }
  bool full() { return (count==s.size()) ; }
  bool empty() { return (count==0) ; }

  void push(double);
  void inspect();
  double pop();
};

#endif

I have a problem with the Stack() constructor, since it returns an error that says:

no default constructor exists for class "Array<double>"

I have tried to pass in arguments, like (int size, double val) but that does not seem the problem. Moreover, I don't know how to initialize the Array <double> s with the desired buffer length.

Kemosabe
  • 15
  • 3
  • In fact, the class Stack does not know how to build its `s` member variable. Try to pass the right values to `s` while construction in the ctor of the Stack. – TonySalimi Aug 19 '22 at 17:21

1 Answers1

0

It seems that in the constructor of your Stack class, you have forgotten to initialize the s member variable with its right input parameters. So you can do like this:

class Stack 
{
  Stack(): 
    s(10, 0) // s will include 10 items each 0 at the beginning
    // initialize the rest ... 
  {}
// implementation
TonySalimi
  • 8,257
  • 4
  • 33
  • 62