C++中使用模板类Array实现Stack类时构造函数报错问题
问题解决:用给定Array类实现Stack并修复构造函数报错
报错原因
Array类仅提供了带参数的构造函数(Array(int size, A val))和拷贝构造函数,没有无参默认构造函数。Stack类的默认构造函数执行时,会自动尝试初始化成员Array<double> s,但找不到Array的默认构造函数,因此编译报错。
解决方案
1. 修正Stack的构造函数
必须通过成员初始化列表,在创建Stack对象时直接初始化Array成员s,指定初始的缓冲区长度和默认值。比如我们可以给Stack设置一个默认初始容量(比如10),默认值设为0.0。
2. 实现Stack的核心方法
完成push、pop、inspect的逻辑,结合Array的resize方法处理栈满的情况。
修改后的完整Stack代码
#ifndef STACK_H #define STACK_H #include <iostream> #include "Array.hh" class Stack { // Implementation private: int count; // Interface public: Array<double> s; // 使用成员初始化列表初始化Array成员s,指定初始大小和默认值 Stack() : count(0), s(10, 0.0) {}; int nitems() { return count ; } bool full() { return (count==s.size()) ; } bool empty() { return (count==0) ; } void push(double val) { if (full()) { // 栈满时扩容,比如扩容到当前大小的2倍 s.resize(s.size() * 2); } s[count++] = val; } void inspect() { std::cout << "Stack contents (top to bottom): "; for (int i = count - 1; i >= 0; --i) { std::cout << s[i] << " "; } std::cout << std::endl; } double pop() { if (empty()) { std::cerr << "Error: Stack is empty!" << std::endl; // 这里可以根据需求抛出异常或者返回默认值,这里返回0.0作为示例 return 0.0; } return s[--count]; } }; #endif
关键说明
- 成员初始化列表
Stack() : count(0), s(10, 0.0) {}直接调用Array的带参构造函数,避免了默认构造函数的调用需求。 push方法中,当栈满时调用Array的resize方法扩容,保证栈可以动态增长。pop方法做了空栈判断,避免越界访问。
内容的提问来源于stack exchange,提问作者Kemosabe
相关产品推荐
相关产品推荐

