为什么静态数组成员变量在调用对象的实例后不显示任何内容?
Why is the static array member variable showing nothing after calling the instance of the object?
目前正在用 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;
}
操作员工作得很好。布尔值工作得很好,一旦我弄清楚插入尾巴,我就会做remove_head和remove_tail的事情。现在,它没有为我在主内部创建的对象创造任何机会。
#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
我的静态方法中发生了什么,用于处理我缺少的所有私有属性?我到底做错了什么?
代码的问题在于静态词的误用。实际上,static 意味着不与对象的实例相关联:这意味着静态成员(在本例中为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
用于保留变量。
- 从C++实例化QML
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 实例化模板时,我是否必须显式显示参数包中的类型?
- char阵列使用新的实例化后显示垃圾
- 按下热键时显示一个对话框实例
- 没有重载函数的实例.(消息框::显示)
- QMLApplicationViewer 多个实例仅首先显示窗口
- 协同创建实例失败,并显示错误"System can not find the file specified"