2 github 34713651 github_34713651 于 2016.04.19 11:43 提问

C++操作符【】重载BUG

小白一只,最近在学C++重载符时,想到能不能写一个链表类,重载[]来模拟数组,但遇到了BUG
代码如下:

List.h:
#include
using namespace std;

struct List
{
int data; //数据;
struct List * pNext; //指向下一节点
};

class L
{
public:
L();
int operator const;
~L();

private:
int count; //数据个数;
struct List * Phead; //链表头指针;
};

List.cpp:
#include "A.h"
#include
using namespace std;
L::L() //创建链表;
{
struct List * Phead,* p1,* p2;
Phead = new struct List;
p1 = p2 = Phead;
cout<<"请输入数据个数"< cin>>count;
for (int i = 1; i <= count ; ++i) //创建链表节点来储存数据;
{
p1 = new struct List;
cout<<"请输入第"< cin>>p1->data;
p2->pNext = p1;
p2 = p1;
}
p1 ->pNext = NULL;
}

int L::operator const
{
if (n+1>count) //检查越界;
{
cout<<"数组越界"< exit(0);
}
struct List * p = Phead->pNext;
for (int i = 0;i < n; ++i) //找出第n个节点;
{
p = p->pNext; //BUG!!!!
}
return p->data; //返回数据;
}

L::~L() //销毁链表;
{
...
}

main:
#include
#include
#include "List.h"
using namespace std;

int main(void)
{
L l1;
cout<<l1[0]<<endl;
system("pause");
return 0;
}

调试的时候第一次到BUG那行就报错,但我找不出来错误,因为在别的函数中p=p->pNext是允许的,求教大神。

1个回答

lbcab
lbcab   2016.04.19 12:19
已采纳

你在init()函数中定义了变量struct List * Phead, 覆盖了成员变量, 所以你在init中的赋值并没有更新Phead指针的值.
将init中的变量Phead删除, 再试一下.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言之重载运算符()/[]/++/->等运算符
C语言之重载运算符()/[]/++/->等预算符文章链接:知识点 重载()运算符; 重载[]运算符; 重载++和->运算符; 新名词记录{operator} 概述operator操作符一文包括两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换)。这是C++和pascal扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要
对于c++中流操作符重载的理解
对于IO成员函数的重载不应该是一个成员函数的方式,并且应该声明为友元 一、如果为成员函数,都会有一个某人的参数,也就是this指针,为左操作数,下面考虑将其声明为成员函数的方式 对于cout 对于t ostream& operator 其中cout匹配左操作数,t匹配右操作数,在这里cout就会与t匹配,而t与cout匹配,矛盾 二、应该是一个全局的函数 因为本身全局
操作符重载的两种用法(前置后置++)
一.操作符重载基础: 运算符函数是一种特殊的成员函数或友元函数 1.重载为类成员函数,解释为: ObjectL.operator op(ObjectR)      左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递 2.重载为友元函数,解释为: operator op(ObjectL,ObjectR)    左右操作数都由参数传递 3.为什么要有操作符重
C++——如何重载*(指针)操作符
在学习boost库的4.3.3节时,看到了在类中重载了*(指针)操作符,就自己写了个测试程序~#include <iostream> using namespace std;class test{ public: test(int input) :num(input){} ~test(){} int operator * () const{//因为要用到this,所以为con
C++ 重载操作符 operator
参数个数的限定     非成员函数:   单目运算符:参数表中只有一个参数;   双目运算符:参数表中只有两个参数       成员函数:   单目运算符:参数表中没有参数;   双目运算符:参数表中只有一个参数 operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。    这是C++扩展运算
所有C++操作符重载的例子
1.[ ]操作符重载 C++语言规定:“[ ]”只能作为类的成员函数进行重载。 “[ ]”是C++中的下标运算符,对于数组或指针来说,下表运算的语义是确定的,不能进行重载。因此,如果看到一个运算结果不是数组或指针的表达式后跟“[ ]”运算符,一定是对“[ ]”进行了重载。 一个例子: #include using namespace std; class A { int num
C++智能指针与重载操作符
简单记录一下C++的智能指针和重载操作符智能指针C++的智能指针是克服C++大坑的非常有用的的手段,之所以说它智能,是因为它为程序员克服了重要的编程问题——悬挂指针重载操作符重载操作符,在一定程度上,我觉得不是必要的。当然,为了更好地体现C++代码的简介特性还有面向对象特性,重载操作符确实起了非常重要的作用。在重载操作符的基础上,C++的一些类可以设计得非常复杂,但使用起来会非常人性化。把智能指针和
C++输入输出操作符重载
1. 输入输出操作符简介C++中输入操作符是>>,输出操作符是<<,又叫做流对象的“插入操作符”和“提取操作符“。其实这两个操作符最初是在C语言中用于整数的移位运算,到了C++中才利用操作符重载的技术将它们应用于输入、输出操作。2.重载的原因应用于基本类型的输入、输出操作都已经在C++标准库中定义好,没有必要重新定义,也不允许重新定义。而对于用户自定义类来说,如果想利用输入、输出操作符进行本类对象的
结构体中运算符的重载
C++中,结构体是无法进行==,>,=, 比如二分查找,binary_crearch只能对数组进行查找,如果是结构体数组的话,它会报错。但很可惜,实际编程中,大部分时候操作对象是结构体数组。 二分查找结构体数组的程序如下: #include #include #include using namespace std; struct point { int elem; bool
关于结构体的操作符重载和定义在内部的函数
首先结构体和类是有相似的地方的,可以进行运算符重载。 下面以=为例, #include using namespace std; struct P { int a; int b; //虽然已经对结构体进行=重载,但是这里只是举一个例子而已 P& operator=(P& temp) { a=temp.a; b=temp.b; return