Можно ли использовать внутри шаблонного класса вектор элементов стека классов?

У меня есть «stack.h» и «stack.cpp» файл, которые определяют класс ручной стека.

Сейчас я хочу создать еще одно «имя» класса, в состав которого входит вектор стеков «nr», и я не уверен, с чего начать.

depou.h:

#pragma once
#include <vector>
#include "stiva.h"
template <class T>
class depou {
private:
int nr;
std::vector<stiva<T> > depouArray;

public:
depou (int x, int lungTren);
};

template <class T>
depou<T>::depou (int x, int lungTren){
int i;
nr = x;
depouArray = new std::vector<stiva<T> > (nr);
/*  for (i=0; i<nr; i++){
depouArray[i] = stiva<T> (lungTren);
} this is incorrect */
}

Мое name.h не компилируется, я просто хочу знать, возможно ли создать вектор такого типа.

Мой заголовок стека называется «stiva», поэтому я отредактировал файл «name.h» в соответствии с этим.

stiva.h

#pragma once

template <class T>
class stiva {
private:
int top;
int size;
T *stackArray;

public:
stiva();
stiva (int s);
~stiva (){ delete [] stackArray; }
int push (const T&);
int pop (T&);
int topElem (T&);
int isEmpty (){return top == -1;}
int isFull () {return top == size -1;}
int search (T x);
void setSize (const int& sz){
size=sz;
}
};

template <class T>
stiva<T>::stiva (){
size = 10;
top = -1;
stackArray = new T[size];
}

template <class T>
stiva<T>::stiva (int s){
size = s>0 && s<1000? s : 10;
top = -1;
stackArray = new T[size];
}

template <class T>
int stiva<T>::push (const T& x){
if (!isFull()){
stackArray[++top] = x;
return 1;
}
else{
size *= 2;
stackArray = (T*) realloc (stackArray, 2*size * sizeof(T));
stackArray[++top] = x;
return 1;
}
return 0;
}

template <class T>
int stiva<T>::pop (T& popValue){
if (!isEmpty ()){
popValue = stackArray[top--];
return 1;
}
return 0;
}

template <class T>
int stiva<T>::topElem (T& topValue){
if (!isEmpty ()){
topValue = stackArray[top];
return 1;
}
return 0;
}

в основном я инициализирую так:

Депу д (5,10);

1

Решение

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

template <class T>
class name {
private:
int nr;
std::vector<stack<T> > nameArray;

public:
name (int x) : nr(x), nameArray(nr) {}
//other methods
};

Рабочий пример здесь: http://codepad.org/ZT9iuQEg

0

Другие решения

Вам не нужно использовать calloc в этом коде (и если он компилируется, это, вероятно, также вредоносно).

На самом деле, если ваш код просто нужно переименовать в тип std::vector<std::stack<T>> к чему-то более читабельному, вы можете использовать:

template<typename T> using name = std::vector<stack<T>>;

вместо.

В противном случае вы можете просто исправить свой текущий код с помощью:

name (int x)
: nr(x)
, nameArray(nr)
{}
3

Декларация nameArray в порядке, пока ваш stack принимает параметр шаблона. Но вы используете nameArray совершенно неправильно. Попробуй это:

name (int x){
nr = x;
nameArray.resize(x);
}
0

В конструкторе у вас есть:

    nameArray = (stack<T>*) calloc (nr, sizeof(stack<T>) );

Есть несколько проблем с этой линией.

  1. В этом утверждении вы назначаете stack<T>* в std :: vector>. Компилятор должен сказать вам, что это недопустимое назначение.
  2. Попробуйте использовать new а также delete операторы в C ++.

Вы можете исправить проблемы, изменив конструктор в гораздо более простую форму:

name (int x) : nr(x), nameArray(x) {}
0
По вопросам рекламы [email protected]