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

C++向类构造函数传递未知大小数组的实现异常问题

代码错误原因

你的代码无法编译运行,核心是3处问题:

  • C++语法不允许类持有无固定大小的数组引用成员,你定义的Cycle (&cycles)[]属于无界数组引用,仅能作为函数形参(会自动退化为指针),无法作为类成员存储。
  • 数组长度计算逻辑完全错误:sizeof(*cycles)得到的是单个Cycle对象的内存大小,除以sizeof(Cycle)结果恒为1,永远无法得到传入数组的真实元素个数。
  • Cycle.h未引入<string>头文件,使用std::string会触发类型未定义的编译错误。

要实现持有可变数量Cycle对象的需求,优先使用std::vector作为存储容器,无需手动处理裸数组的长度计算、生命周期边界问题,稳定性更高。


修正后完整代码

Cycle.h

#include <string>

class Cycle
{
public:
    Cycle(std::string name) : name(name) {}
    // 按需添加访问私有成员的方法
    std::string getName() const { return name; }
private:
    std::string name;
};

CycleManager.h

#include <vector>
#include <cstddef>
#include "Cycle.h"

class CycleManager
{
public:
    CycleManager(const std::vector<Cycle>& cycles);
    void printCycleCount();
private:
    int currentCycle;
    size_t numberOfCycles;
    std::vector<Cycle> cycles;
};

CycleManager.cpp

#include <iostream>
#include "CycleManager.h"

CycleManager::CycleManager(const std::vector<Cycle>& cycles) 
    : cycles(cycles), currentCycle(0), numberOfCycles(cycles.size())
{}

void CycleManager::printCycleCount()
{
    std::cout << numberOfCycles << std::endl;
}

Main.cpp

#include "CycleManager.h"

int main()
{
    std::vector<Cycle> cycles = {
        Cycle("Cycle 1"), 
        Cycle("Cycle 2"), 
        Cycle("Cycle 3")
    };
    CycleManager cycleManager(cycles);
    cycleManager.printCycleCount(); // 运行后输出3,符合预期
    return 0;
}

可选裸数组实现方案

如果你不想引入std::vector,坚持用原始数组传入,可以通过模板构造函数在编译期自动推导数组长度,无需手动计算大小:
仅需修改CycleManager.h的实现即可,Main.cpp中原始数组的写法无需改动:

#include <cstddef>
#include <iostream>
#include "Cycle.h"

class CycleManager
{
public:
    // 模板构造自动推导传入数组的长度N
    template<size_t N>
    CycleManager(Cycle (&inputCycles)[N]) 
        : cycles(inputCycles), currentCycle(0), numberOfCycles(N)
    {}

    void printCycleCount()
    {
        std::cout << numberOfCycles << std::endl;
    }
private:
    int currentCycle;
    size_t numberOfCycles;
    Cycle* cycles; // 存储数组首地址,注意需保证外部数组生命周期长于CycleManager实例
};

注意该方案需要你自行保证传入的原始数组生命周期比CycleManager实例长,否则会出现悬空指针的内存问题。


内容的提问来源于stack exchange,提问作者seddouguim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:15:32