Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Указатели с++. Проблема вывода элементов массива(выводятся адреса)

Ольга Щербина Olegovich Ученик (108), закрыт 1 год назад
Здравствуйте, во время написания кода возникла проблема с выводом. Мне необходимо вывести "значения", которые хранятся в массиве, а выводятся адреса, что не так?
По условию задачи массив доложен быть фиксированным и базоваться на указателях.

#include <iostream>

#include <string>

using namespace std;


struct Type{

std::string data;

};


class Astack{

std::string *stack[50]; // создаем фиксированный диннамический массив, максимум на 50 элементов

int n; // количество элементов в массиве

public:

Astack(int count); // конструктор, в который передаем количество элементов, для заполнения массива

Astack(const Astack &obj); // конструктор копирования

std::string pop(); // возвращает значение последнего элемента и "удаляет его"

void print();

int num(); //вернуть к-во элементов в стеке

bool isempty(); // проверка пуст ли массив

void push(const Type &r); // добавляем новое значение

};


Astack::Astack(int count)

{

n = count;

std::cout << "Please enter " << count << " values:\n";

std::string str;

for (int i=0; i<n; i++){

std::cout << i+1 << ". ";

std::cin >> str;

stack[i] = &str;

}

}


Astack::Astack(const Astack &obj)

{

n = obj.n;

for (int i=0; i<n; i++)

stack[i]=obj.stack[i];

}


//вывести на экран

void Astack::print() {

for (int i = n-1; i >= 0; --i)

cout << *(stack + i) << " ";

cout << endl;

}


int Astack::num(){

return n;

}


// если н == 0 -> массив пуст -> возвращаем 1

// если н != 0 - > массив не пуст -> возвращаем 0

bool Astack::isempty(){

return (n == 0);

}


std::string Astack::pop(){

--n; // "удаляем последний элемент"

return *stack[n];

}


void Astack::push(const Type &r){

std::string str = r.data ;

stack[n] = &str;

++n;

}

int main(){


// stack работает по принцыпу: последний пришел, первый вышел

// допустим вводим B E T

Astack obj1(3);
obj1.print(); // должно вывестись T E B
obj1.pop(); // т - пришел последний
obj1.print(); // выводим E B

Type d;
d.data = "Hi!";
obj1.push(d);
obj1.print();

}
Лучший ответ
Двоечник Обыкновенный Высший разум (102292) 1 год назад
std::string *stack[50]; // создаем фиксированный диннамический массив, максимум на 50
Вот и ошибка.
Во-первых, std:: вообще не нужен, так как есть строка using namespace std;
Во-вторых, нужно либо так:
string stack[50];
либо так:
string * stack = new string[50];
Остальные ответы
Сергей Гений (56310) 1 год назад
std::string *stack[50] создает статический массив указателей на string (по сути двухмерный массив).
Одномерный динамический это string *stack; где stack = new string[50]; тогда обращение к нему идет по одному индексу stack[0...49];
Одномерный статический - string stack[50]; индексация такая же.

А так как у вас - это stack[0] = new string; **stack = "Hello word"; cout << stack[0][0];
*stack же или stack[0] вернет указаталь с адресом.
Похожие вопросы