c++ - 为什么静态数组成员变量在调用对象的实例后不显示任何内容?

标签 c++ oop methods static constants

目前正在使用 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;
}

运算符(operator)工作得很好。 bool 工作得很好,一旦我弄清楚插入尾部,我就会做remove_head和remove_tail事情。现在,它没有为我在 main.c 中创建的对象提供任何机会。

#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

我的静态方法内部发生了什么来处理我缺少的所有私有(private)属性?我究竟做错了什么?

最佳答案

您的代码的问题在于滥用了 static 一词。事实上,静态意味着不与对象的实例关联:这意味着静态成员(在本例中为 array_ 变量)的内容在您将创建的每个实例之间共享。

这与 insert_tail 方法相同,即使您不创建实例也可以使用该方法。现在,让我们尝试理解您在此方法中编写的内容:

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

在第一行中,您创建了一个新的 Deque 对象。这是第一个错误,因为您没有修改实际的 Deque。然后添加操作,最后返回创建的双端队列。但是,该对象不会保存在任何地方,因为当您调用 deque.insert_tail() 时,您不会在任何地方分配返回值。

让我们尝试将其变得更具体一些。

由于您正在做的是创建数据结构,因此不需要任何静态成员。这是因为所有内容都需要保存在数据结构内。

然后,在 insert_tail 中,您需要删除在其中创建的对象。它看起来像这样:

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

通过这两项修改,代码可能会按预期工作,但是,我建议您专注于改进代码的外观。在变量名末尾使用下划线字符有点令人困惑。在 C 中,您可以在名称 int foo_bar 中使用它作为普通变量,并在 int _foo 开头使用它作为保留变量。

关于c++ - 为什么静态数组成员变量在调用对象的实例后不显示任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52806015/

相关文章:

javascript - 封装在 Javascript 中

java - 调用方法Java

java - 强制使用统一的构造函数和方法注释值?

python - Date 类 - 计算调用它的 Date 对象的星期几的方法

c++ - 如何从 C++ 函数返回多个错误代码

c++ - 按位或运算符

c++ - (2012) Visual C++ LNK2019 错误,也许是模板问题?

c++ - 如何在给定宽度和高度的情况下调整对象的二维 vector 的大小?

c++ - 使用全局变量来保持窗口尺寸的值

c# - 如何使类受继承保护?