Почему переменная-член статического массива ничего не показывает после вызова экземпляра объекта? - PullRequest
0 голосов
/ 14 октября 2018

В настоящее время работаю над объектно-ориентированным программированием на c ++ и испытываю проблемы с экземпляром, в котором ничего не показано по сравнению с созданным мною методом.

Весь код основан на этом объекте, который я создал из заголовкафайл.

#ifndef DEQUE_H_
#define DEQUE_H_


#include <iostream>

const int CAPACITY = 5;
const int DEFAULT = -1;

class Deque
{
public:
    Deque();
    int get_size() const;
    bool is_empty() const;
    bool is_full() const;
    int operator[](int i) const;
    static Deque insert_tail(int);
private:
    int size_;
    static int array_[CAPACITY];
};

std::ostream & operator<<(std::ostream &, const Deque &);


#endif 

Одна из проблем, с которыми я сталкиваюсь, - это метод insert_tail, который не показывает никаких изменений в моем статическом массиве.В самом файле cpp .. это объявления функций.

#

include <iostream>
#include "Deque.h"

Deque::Deque()
    :size_(0)
{

}
int Deque::array_[5] = {};
int Deque::get_size() const
{
    return size_;
}

bool Deque::is_full() const
{
    if (size_ == 5) return 1;
    else return 0;
}

bool Deque::is_empty() const
{
    if (size_!= 5) return 1;
    else return 0;
}

int Deque::operator[](int i) const
{

    int something = array_[i];
    return something;
}

Deque Deque::insert_tail(int x)
{
    Deque d;
    d.size_ += 1;
    int size = d.size_;
    d.array_[size - 1] = x;

    return d;
}

std::ostream & operator<<(std::ostream & cout, const Deque & dq)
{
    cout << dq.get_size() << " [ ";
    for (int i = 0; i < dq.get_size(); ++i)
    {
        cout << dq[i] << " ";
    }
    cout << "]";

    return cout;
}

Оператор работает просто отлично.Bool'ы работают просто отлично, а удаление, заголовок и удаление, я сделаю, как только выясню, вставить хвост.Прямо сейчас, это не делает никаких шансов для самого объекта, который я создал в главном.

#include <iostream>
#include "Deque.h"

void print(const Deque & deque)
{
    static int i = 1;
    std::cout << i << ". " << deque << ", empty: " << deque.is_empty()
            << ", full: " << deque.is_full();
    i++;
}

void test_insert_tail(Deque & deque, int x)
{
    deque.insert_tail(x);
    print(deque); std::cout << "\n";
}

int main()
{
    Deque deque;
    print(deque);
    std::cout << "\n";
    test_insert_tail(deque, 2);
    return 0;
}

Вывод должен выглядеть следующим образом: 1. 1 [2], пусто: 0, заполнено: 0, но выглядит так: 1. 0 [], пусто: 1, заполнено: 0

Что происходит внутри моего статического метода для обработки всех личных атрибутов, по которым мне не хватает?Что я сделал не так точно?

1 Ответ

0 голосов
/ 14 октября 2018

Проблема с вашим кодом заключается в неправильном использовании статического слова.Фактически, статический означает, что он не связан с экземпляром объекта: это означает, что содержимое статического члена (в данном случае переменная array_) является общим для каждого создаваемого вами экземпляра.

То же самое для метода insert_tail, который можно использовать, даже если вы не создаете экземпляр.Теперь давайте попробуем понять, что вы написали в этом методе:

Deque d;
d.size_ += 1;
int size = d.size_;
d.array_[size - 1] = x;
return d;

В первой строке вы создали новый Deque объект.Это первая ошибка, потому что вы не изменяете фактический Deque.Затем вы добавляете операции, и в конце вы возвращаете созданную Deque.Однако этот объект нигде не сохраняется, потому что когда вы вызываете deque.insert_tail(), вы нигде не присваиваете возвращаемое значение.

Давайте попробуем разобраться в этом немного конкретнее.

Поскольку вы создаете структуру данных, вам не понадобится статический член.Это потому, что все должно быть сохранено внутри структуры данных.

Затем внутри insert_tail вам нужно удалить объект, который вы создали внутри.Это будет выглядеть примерно так:

size_ += 1;
int size = size_;
array_[size - 1] = x;

С этими двумя модификациями код, вероятно, будет работать, как и ожидалось, однако я предлагаю вам сосредоточиться на улучшении внешнего вида вашего кода.Использование символа подчеркивания в конце имени переменной немного сбивает с толку.В C единственном сценарии вы можете использовать его внутри имени int foo_bar для обычных переменных и в начале int _foo для зарезервированных переменных.

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