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
相关产品推荐
相关产品推荐

