关于模板和友元的简单问题,在线等

triLine triLine 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
VC++中类模板的声明和其中的函数定义必须放在同一个头文件中.
现在有两个类模板,我都把它们放在一个头文件中,并声明其中的一个类是另一个类的友元. 但是编译没有通过,程序如下, 还请各位指点,问题解决就给分.
#include <iostream.h>
#include "OutOfBounds.h"
template <class T>
class Chain<T>; // 前向引用不知写法是否正确????
template <class T>
class ChainNode {
friend Chain<T>;
private:
T data;
ChainNode<T> *link;
};

template<class T>
class Chain {
public:
Chain() {first = 0;}
~Chain();
bool isEmpty() const {return first == 0;}
int length() const;
bool find(int k, T& x) const;
int search(const T& x) const;
Chain<T>& del(int k, T& x);
Chain<T>& insert(int k, const T& x);
void output(ostream& out) const;
private:
ChainNode<T> *first; // 指向第一个节点的指针
};

template<class T>
Chain<T>::~Chain(){ // 链表的析构函数,用于删除链表中的所有节点
ChainNode<T> *next; // 下一个节点
while (first) {
next = first->link;
delete first;
first = next;
}
}

template<class T>
int Chain<T>::length() const { // 返回链表中的元素总数
ChainNode<T> *current = first;
int len = 0;
while (current) {
len++;
current = current->link;
}
return len;
}

template<class T>
bool Chain<T>::find(int k, T& x) const { // 寻找链表中的第k 个元素,并将其传送至x
//如果不存在第k 个元素,则返回false,否则返回true
if (k < 1) return false;
ChainNode<T> *current = first;
int index = 1; // current 的索引
while (index < k && current) {
current = current->link;
index++;
}
if (current) {x = current->data; return true;}
return false; // 不存在第k 个元素
}

template<class T>
int Chain<T>::search(const T& x) const{
// 寻找x ,如果发现x ,则返回x 的地址
// 如果x 不在链表中,则返回0
ChainNode<T> *current = first;
int index = 1; // current 的索引
while (current && current->data != x) {
current = current->link;
index++;
}
if (current) return index;
return 0;
}

template<class T>
void Chain<T>::output(ostream& out) const{
// 将链表元素送至输出流
ChainNode<T> *current;
for (current = first; current; current = current->link)
out << current->data << " ";
}

template <class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
{x.output(out); return out;}

template<class T>
Chain<T>& Chain<T>::del(int k, T& x){
// 把第k 个元素取至x ,然后从链表中删除第k 个元素
// 如果不存在第k 个元素,则引发异常OutOfBounds
if (k < 1 || !first)
throw OutOfBounds(); // 不存在第k 个元素
// p 最终将指向第k 个节点
ChainNode<T> *p = first;
// 将p 移动至第k 个元素,并从链表中删除该元素
if (k == 1) // p 已经指向第k 个元素
first = first->link; // 删除之
else { // 用q 指向第k - 1 个元素
ChainNode<T> *q = first;
for (int index = 1; index < k - 1 && q; index++)
q = q->link;
if (!q || !q->link)
throw OutOfBounds(); //不存在第k 个元素
p = q->link; // 存在第k 个元素
q->link = p->link;
} // 从链表中删除该元素
//保存第k 个元素并释放节点p
x = p->data;
delete p;
return *this;
}

template<class T>
Chain<T>& Chain<T>::insert(int k, const T& x){
// 在第k 个元素之后插入x
// 如果不存在第k 个元素,则引发异常OutOfBounds
// 如果没有足够的空间,则传递NoMem异常
if (k < 0) throw OutOfBounds();
// p 最终将指向第k 个节点
ChainNode<T> *p = first;
// 将p 移动至第k 个元素
for (int index = 1; index < k && p; index++)
p = p->getLink();
if (k > 0 && !p) throw OutOfBounds(); //不存在第k 个元素
// 插入
ChainNode<T> *y=new ChainNode<T>;
y->getData() = x;
if (k) { // 在p 之后插入
y->getLink() = p->getLink();
p->getLink() = y;
}
else { // 作为第一个元素插入
y->getLink() = first;
first = y;
}
return *this;
}


...全文

相关推荐

C++中常见问题答疑

C++中让人迷惑的问题,疑点,一键解析

Be_insighted

C++信号槽机制实现:从Qt到标准库的观察者模式实践

观察者模式是软件设计中实现对象间松耦合通信的核心设计模式,它通过定义对象间的一对多依赖关系,使得一个对象状态改变时,所有依赖它的对象都能自动收到通知并更新。在C++中,这一模式常通过回调函数、事件监听器等机制实现,但传统实现往往面临类型安全、生命周期管理复杂等挑战。现代C++通过模板元编程、std::function、智能指针等特性,为构建类型安全、松耦合的事件系统提供了强大支持,显著提升了代码的可维护性和复用性。这种技术方案在GUI框架、游戏引擎、服务器架构等需要高效事件驱动的应用场景中具有重要价值。本文

weixin_30861797

C++ 知识补充

向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。

chxin14016

C++实战教程:从核心概念到项目开发的全方位指南

C++作为一门支持面向对象、泛型编程和系统级资源管理的语言,其核心在于对内存、对象生命周期和编译模型的精细控制。理解指针、引用、RAII(资源获取即初始化)等底层原理,是掌握C++高效编程的基础。这些概念不仅关系到代码的正确性与安全性,更是实现高性能应用的关键。在现代软件开发中,结合标准模板库(STL)和智能指针等工具,可以大幅提升开发效率与代码可靠性。本教程通过结构化的学习路径,从基础语法到实战项目,系统讲解如何运用这些技术构建如图书管理系统等实际应用,帮助学习者跨越从理论到实践的鸿沟。

樱红蕉绿

C++常见问题解答

很有用的C++小结,解除学习C++的疑惑

jiangnanyuer
评论 8
收藏 已收藏
分享
返回顶部
triLine
VC/MFC 16,550 成员 421,606 内容