You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:18:24