| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 615 人关注过本帖
标题:C++ list链表问题 这些错误是为什么啊
只看楼主 加入收藏
KANCY
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-3-15
结帖率:0
收藏
 问题点数:0 回复次数:8 
C++ list链表问题 这些错误是为什么啊
#include "stdafx.h"
#include<iostream>
using namespace std;
//---------------------
class TNode
{
    friend class TList;
    friend ostream& operator<<(ostream& os,TNode& node);
public:
    TNode(int data=0);
   
private:
    int m_data;
    TNode* next;
};
ostream& operator<<(ostream& os,TNode& node)
{
    os<<node.m_data;
    return os;
}
TNode::TNode(int data)
{
    m_data = data;
    next = NULL;
}

//----------------------
class TList
{
public:
    void InsertFirst(int data);
    void InsertLast(int data);
public:
    void Show();
private:
    TNode* Tail();
private:
    TNode head;
};
void TList::Show()
{
    TNode* p = this->head.next;
    while(p != NULL)
    {
        cout<<(*p)<<" ";
        //
        p = p->next;
    }
    cout<<endl;
   
}
TNode* TList::Tail()
{
    //节点的next==NULL
    TNode* p = &head;
    while(p->next != NULL)
         p = p->next;
    return p;
}
void TList::InsertLast(int data)
{
    //找到最后一个节点
    TNode* last = Tail();
    //创建一个新节点:构造函数中赋值
    TNode* pNode = new TNode(data);
    //插入链表:位置
    last->next = pNode;

}
void TList::InsertFirst(int data)
{
    //创建一个新节点:构造函数中赋值
    TNode* pNode = new TNode(data);
    //插入链表:位置
    pNode->next = this->head.next;
    this->head.next = pNode;
}
//=========================================
//
template<class T>
T Add(T x,T y)
{
    return x+y;
}
//----------------------------------------
int main(int argc, char* argv[])
{
    TList lst;
    lst.InsertFirst(1);
    lst.InsertFirst(10);
    lst.InsertFirst(19);
    lst.InsertLast(29);
    lst.InsertLast(129);

    lst.Show();

    int n = Add(1,10);
    double fn = Add<double>(1.0,2.3);
    //------------------------
    return 0;
}

error C2248: 'm_data' : cannot access private member declared in class 'TNode'
        list\list.cpp(16) : see declaration of 'm_data'
list\list.cpp(48) : error C2593: 'operator <<' is ambiguous
搜索更多相关主题的帖子: private include public friend 
2013-04-08 17:05
KANCY
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-3-15
收藏
得分:0 
什么意思啊这错误
2013-04-08 17:05
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
ostream& operator<<(ostream& os,TNode& node)
{
    os<<node.m_data;
    return os;
}

m_data是私有的,你怎么可能能调用得到?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-08 17:31
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
收藏
得分:0 
你把错误翻译过来就可以基本知道是什么意思了,多思考
2013-04-08 18:06
海妖精
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-4-9
收藏
得分:0 
不能访问私有成员cannot access private member
2013-04-09 22:02
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
m_data是私有的,你要明白变量的权限,只有弄清楚这后,才能真确调用

Maybe
2013-04-09 22:33
yty123193
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-23
收藏
得分:0 
直接在node里把data设置为公有成员就行了,在TList里设置成公有成员函数就行了具体不太好说,我也做过一个,跟你的不太一样,意思差不多,你看看懂不
#include <iostream>
#include <cassert>
using namespace std;

template <class T>
class Node {
public:
    Node<T> *next;    //指向后继结点的指针
    T data;    //数据域
    Node (const T &data, Node<T> *next = 0);    //构造函数
    void insertAfter(Node<T> *p);    //在本结点之后插入一个同类结点p
    Node<T> *deleteAfter();    //删除本结点的后继结点,并返回其地址
    Node<T> *nextNode();            //获取后继结点的地址
};
//类的实现部分
//构造函数,初始化数据和指针成员
template <class T>
Node<T>::Node(const T& data, Node<T> *next/* = 0 */) : data(data), next(next) { }
  
//返回后继结点的指针
template <class T>
Node<T> *Node<T>::nextNode() {
    return next;
}

//在当前结点之后插入一个结点p
template <class T>
void Node<T>::insertAfter(Node<T> *p) {
    p->next = next; //p结点指针域指向当前结点的后继结点
    next = p;     //当前结点的指针域指向p
}
//删除当前结点的后继结点,并返回其地址
template <class T>
Node<T> *Node<T>::deleteAfter() {
    Node<T> *tempPtr = next;    //将欲删除的结点地址存储到tempPtr中
    if (next == 0)    //如果当前结点没有后继结点,则返回空指针
        return 0;
    next = tempPtr->next;    //使当前结点的指针域指向tempPtr的后继结点
    return tempPtr;            //返回被删除的结点的地址
}


template <class T>
class LinkedList {
   
private:
    //数据成员:
    Node<T> *front;//头指针
    Node<T> *currPtr; //当前指针
    int size;

public:
    LinkedList();   
    bool isEmpty() const;
    void reset();//初始化指针位置
    bool next();//指向下一给节点
    bool endOfList() const;
    void insertFront(const T &item);
    void insertRear(const T &item);
    bool insertAt(const T &item);
    bool insertAfter(const T &item);
    T& data();

};

template <class T>
LinkedList<T>::LinkedList()
{
    front=NULL;
    currPtr=NULL;
    size=0;
}

template <class T>
void LinkedList<T>::reset()
{
    if(front!=NULL)
    {
    currPtr=front;
    }
}

template <class T>
bool LinkedList<T>::next()
{
    if(currPtr==NULL)
        return false;
    if(currPtr->next==NULL)
        return false;
    currPtr=currPtr->next;
    return true;
}                                   

template <class T>
T &LinkedList<T>::data()
{
    assert(currPtr!=NULL);
    return currPtr->data;

}

template <class T>
void LinkedList<T>::insertFront(const T &item)
{
    Node<T> *p = new Node<T>(item);
    p->next = front;
    front = p;
    size++;
    if(size == 1)
    {
        currPtr = front;

    }
   
}

template <class T>
void LinkedList<T>::insertRear(const T &item)
{

    while(currPtr->next!=NULL)
            currPtr=currPtr->next;
    Node<T>*  pNewNode=new Node<T>(item);
            currPtr->insertAfter(pNewNode);
    size++;
   
}

template <class T>
bool  LinkedList<T>::insertAt(const T &item)
{
    if(currPtr==NULL)
    {
        return false;
    }
    if(currPtr==front)
    {
        insertFront(item);
        return true;
    }
        Node<T>*p=front;
        while(p->next!=currPtr)
            p=p->next;
        Node<T>*pNewNode=new Node<T>(item);
            p->insertAfter(pNewNode);
        size++;
        
        return true;
}

template <class T>
bool  LinkedList<T>::insertAfter(const T &item)
{
    if(currPtr==NULL)
    {
        return false;
    }
    if(currPtr->next==NULL)
    {
        insertRear(item);
        return true;
    }
        Node<T>*p=front;
        while(p->next!=currPtr->next)
            p=p->next;
        Node<T>*pNewNode=new Node<T>(item);
        p->insertAfter(pNewNode);
        size++;
        
        return true;
}


template <class T>
bool LinkedList<T>::isEmpty() const
{
    if(front==NULL)
    {
        cout<<"The list is empty."<<endl;
        return true;
    }
}

template <class T>
bool LinkedList<T>::endOfList() const
{
    if(currPtr->next==NULL)
    {
        cout<<"The list is end."<<endl;
        return true;
    }
}

int main()
{
    LinkedList<int> A;
    A.insertFront(12);
    A.insertAt(13);
    A.reset();
    A.insertAfter(15);
    A.next();
    cout<<A.data()<<endl;

return 0;
}
2013-04-10 16:17
KANCY
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-3-15
收藏
得分:0 
回复 3楼 peach5460
不是已经定义友元了吗,那个是友元函数
2013-04-11 22:30
KANCY
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-3-15
收藏
得分:0 
回复 7楼 yty123193
  那个运算符重载的怎么回事啊
2013-04-11 22:39
快速回复:C++ list链表问题 这些错误是为什么啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026849 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved