C++中的分隔符、指针和结构
Deque, Pointers, and Structs in C++
给定这些数据成员:
private:
struct DequeNode {
Object item;
DequeNode *next;
DequeNode *prev;
};
DequeNode *front;
DequeNode *back;
};
我很困惑数据成员的正面或背面是什么。前面只是一个指向DequeNode对象的指针吗? 所以前面不会有项目、下一个或上一个?
这是用于双类的实现。 这让我感到困惑,因为在它的 getFront 方法中,它返回 front->next。 我的印象是前面只是一个没有下一个成员的指针。
这是完整的标题:
#ifndef DEQUE_H
#define DEQUE_H
#include <iostream>
using namespace std;
template <class Object>
class Deque {
public:
Deque(); // the constructor
Deque(const Deque &rhs); // the copy constructor
~Deque(); // the destructor
bool isEmpty() const; // checks if a deque is empty.
int size() const; // retrieves # deque nodes
const Object &getFront() const; // retrieve the front node
const Object &getBack() const; // retrieve the tail node
void clear(); // clean up all deque entries.
void addFront(const Object &obj); // add a new node to the front
void addBack(const Object &obj); // add a new node to the tail
Object removeFront(); // remove the front node
Object removeBack(); // remove the tail node
const Deque &operator=(const Deque &rhs); // assignment
private:
struct DequeNode { // a deque node
Object item;
DequeNode *next;
DequeNode *prev;
};
DequeNode *front;
DequeNode *back;
};
#include "deque.cpp.h"
#endif
然后这是 cpp:
template <class Object>
Deque<Object>::Deque() { // the constructor
front = back = NULL;
}
template <class Object>
Deque<Object>::Deque(const Deque &rhs) { // the copy constructor
front = back = NULL;
*this = rhs;
}
template <class Object>
Deque<Object>::~Deque() { // the destructor
clear();
}
template <class Object>
bool Deque<Object>::isEmpty() const { // check if a deque is empty
return front == NULL;
}
template <class Object>
int Deque<Object>::size() const { // retrieves # deque nodes
int i = 0;
for (DequeNode *ptr = front; ptr != NULL; ptr = ptr->next) // traverse que
{
++i;
}
return i;
}
template <class Object>
const Object &Deque<Object>::getFront() const { // retrieve the front node
if (isEmpty())
throw "empty queue";
return front->item;
}
template <class Object>
const Object &Deque<Object>::getBack() const { // retrieve the tail node
if (isEmpty())
throw "empty queue";
return back->item;
}
template <class Object>
void Deque<Object>::clear() { // clean up all entries.
while (!isEmpty()) // dequeue till the queue gets empty.
removeFront();
}
template <class Object>
void Deque<Object>::addFront(const Object &obj) {// add a new node to front Implement the function body.
}
template <class Object>
void Deque<Object>::addBack(const Object &obj) { // add a new node to tail
// Implement the function body.
}
template <class Object>
Object Deque<Object>::removeFront() { // remove the front node
// Implement the function body.
}
template <class Object>
Object Deque<Object>::removeBack() { // remove the tail node
// Implement the function body.
}
template <class Object>
const Deque<Object> &Deque<Object>::operator=(const Deque &rhs) { // assign
if (this != &rhs) { // avoid self assignment
clear();
for (DequeNode *rptr = rhs.front; rptr != NULL; rptr = rptr->next)
addBack(rptr->item);
}
return *this;
}
我试图只插入一个对象以确保我正确使用箭头运算符,但这一直给我一个分段错误:
template <class Object>
void Deque<Object>::addFront(const Object &obj) {// add a new node to front Implement the function body.
if (isEmpty()) // If the deque is empty, just throw the item in there.
{
front->item = obj;
front->next = NULL;
front->prev = back;
back->next = front;
back->item = obj;
back->prev = NULL;
}
else
{
// Not inserting on an empty list.
}
}
但是我一直遇到分段错误。 通过添加打印语句,它似乎在"front->item = obj;"行失败有人可能知道为什么这是不正确的吗?
正面和背面分别是你的deque的第一个指针和最后一个指针。
注释中提到的方法 getFront() 提供了一种访问其中数据(项目)的方法。
但它并不是真正的deque,它看起来更像是一个队列,因为没有定义迭代器(也许你为了提交的清晰度而删除了它们)。
是的,你是对的,因为"front"是"DequeNode"类型的指针,所以"front"只是指向"DequeNode"类型的对象。这就是为什么你可以访问由"front"指针指向的"DequeNode"类型的对象的任何成员。
在第二个问题上,您遇到分段错误,这只是因为您尝试访问"front",当 deque 为空时,它持有 NULL 值。要从"front"获取某些内容,当双端不为空时,它应该指向双端面中的第一个对象/节点(类型为"DequeNode")。
关于你对getFront()方法的第三个疑问。因此,getFront() 方法的目的是获取队列中前端节点的数据部分,在本例中为"item"。
template <class Object>
const Object &Deque<Object>::getFront() const { // retrieve the front node
if (isEmpty())
throw "empty queue";
return front->item;
}
相关文章:
- 如何在 C# 中映射双 C 结构指针?
- 指针或结构的矢量
- MSVC将仅移动结构参数解释为指针
- 如何访问指针结构的成员变量?
- 如何将变量从变量传递到指针结构对象
- 如何在函数中检索指针结构
- C :变量的点地址至指针结构成员的地址
- C++指针结构不会被删除
- 初始化指针结构 - 内存中的外观
- C++指针结构和多线程
- c++中指针结构的运算符重载
- 为什么我不能转发声明指针结构?
- C# 如何定义新的指针结构
- 如何处理大型指针结构
- 我怎么能写一个函数的定义在模板类中声明返回指针结构对象
- 我如何编程指针结构或类变量在c++
- 具有指针结构的类所需的析构函数
- 为什么在非指针结构上进行类型转换会出现语法错误
- 语法:做binary_search (STL)排序向量的指针结构
- /a.检测到Glibc.out: munmap_chunk():无效指针- c++结构体的动态数组