问题如下:我在类中使用列表(禁止使用 STL)我至少编写了方法。此外,当我在 main 中描述实例并尝试调用 addElement 方法时,会发生内存访问错误。怎样成为?为什么会这样?
Main.cpp 列表
#include "stdafx.h"
#include "vset.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vset a;
a.AddElement(&a.ilast, 5);
// a.AddElement(&a.last, 7);
a.PrintList(a.ihead);
return 0;
}
列出vset.cpp类的实现
#pragma once
#include "vset.h"
#include <iostream>
using namespace std;
vset::SingleList * vset::makeFirst(int d)
{
SingleList *cRec = new SingleList;
cRec->Data = d; cRec->next = 0; cRec->prev = 0;
return cRec;
}
void vset::AddElement(vset::SingleList **last, int d)
{
vset::SingleList *cRec = new SingleList;
cRec->Data = d; cRec->next = 0; cRec->prev = *last;
(*last)->next = cRec;
*last = cRec;
}
vset::SingleList * vset::search(SingleList * const pbeg, int d)
{
SingleList *cRec = pbeg;
while (cRec)
{
if (cRec->Data == d)break;
cRec = cRec->next;
}
return cRec;
}
bool vset::remove(vset::SingleList **head, vset::SingleList **last, int key)
{
if (SingleList *pkey = search(*head, key))
{
if (pkey == *head)
{
*head = (*head)->next;
(*head)->prev = 0;
}
else if (pkey == *last)
{
*last = (*last)->prev;
(*last)->next = 0;
}
else {
(pkey->prev)->next = pkey->next;
(pkey->next)->prev = pkey->prev;
}
delete pkey;
return true;
}
return false;
}
vset::SingleList * vset::insert(vset::SingleList * const head, vset::SingleList **last, int key, int d)
{
if (SingleList *pkey = search(head, key))
{
SingleList *cRec = new SingleList;
cRec->Data = d; cRec->next = pkey->next;
cRec->prev = pkey; pkey->next = cRec;
if (pkey != *last) (cRec->next)->prev = cRec;
else *last = cRec;
return cRec;
}
return 0;
}
void vset::PrintList(vset::SingleList * const head)
{
SingleList *cRec = head;
while (cRec)
{
cout << cRec->Data << " ";
cRec = cRec->next;
}
}
void getData()
{
}
vset::vset()
{
SingleList *ihead = makeFirst(0);
SingleList *ilast = ihead;
// getLast(&last);
}
vset::vset(int d)
{
SingleList *ihead = makeFirst(d);
SingleList *ilast = ihead;
}
/*vset::SingleList getLast(vset::SingleList **last)
{
static vset::SingleList **olast;
if (!last) olast = last;
return **olast;
}*/
vset::~vset()
{
}
vset.h 接口
#pragma once
class vset
{
public:
struct SingleList
{
int Data;
SingleList *next;
SingleList *prev;
};
SingleList *ihead;
SingleList *ilast;
public:
vset();
vset::vset(int d);
~vset();
SingleList * makeFirst(int d);
void AddElement(SingleList **last, int d);
SingleList * search(SingleList * const pbeg, int d);
bool remove(SingleList **head, SingleList **last, int key);
SingleList * insert(SingleList * const head, SingleList **last, int key, int d);
void PrintList(SingleList * const head);
void getData();
vset::SingleList getLast(vset::SingleList);
};
让我们开始修复错误:)
#pragma once在cpp类?严重地?vset::vset(int d);- 这就是您不需要在类声明中编写的方式。这样写是否正确,vset(int d);甚至这样写更好explicit vset(int d);构造函数-析构函数中的错误
此处声明了指针,其名称与类变量相交。从构造函数退出后,这些指针将丢失,并且类变量的值将保持未初始化状态。在这样的地方写构造函数是正确的
在那之后,代码至少已经开始并且可以正常工作了。
但是其中还有另一个泄漏-析构函数中没有释放内存。好处是您可以编写一个 clear 函数来清除内容并在析构函数中简单地调用它。
但是还有一些注意事项。AddElement 函数需要一个指向最后一个元素的指针。如果你只传递一个指向任意元素的指针,那么它会破坏列表。(它会像一个叉子)。因此,最好从那里完全删除此参数。
此外,您拥有的功能名称不一致。还有小写字母,还有CamelCase,还有camelCase。把所有东西都放在同一个视图上。