C++中如何在类内部使用类成员变量?附代码报错问题
问题分析与解决方案
你的代码核心问题不是this->的用法,而是C++不允许用类的非静态成员变量作为数组的大小——因为非静态成员vnum属于类的实例,只有创建对象时才会有具体值,编译阶段编译器根本不知道它的大小,所以不管加不加this->,这种写法都是非法的。
下面给你几种可行的修复方案,按需选择:
方案1:固定数组大小(编译时确定)
如果vnum的大小是固定不变的,用静态常量或者枚举来定义:
// 静态常量方式 class poly { public: static const int vnum = 5; // 编译时确定值 vrtx vrts[vnum]; }; // 或者枚举方式 class poly { public: enum { vnum = 5 }; vrtx vrts[vnum]; };
方案2:动态大小数组(推荐用std::vector)
如果vnum需要在运行时指定(比如创建对象时传入),用std::vector来替代原生数组,它会自动管理内存,避免泄漏:
#include <vector> class vrtx { public: int x, y, z; }; class poly { public: int vnum; std::vector<vrtx> vrts; // 构造函数初始化vnum和vector的大小 poly(int num) : vnum(num), vrts(num) {} };
使用时直接创建对象:poly p(10);,此时p.vrts就是包含10个vrtx实例的动态数组。
方案3:手动动态分配(不推荐)
如果你一定要用原生指针实现动态数组,需要自己管理内存(注意写析构函数释放,还要处理拷贝/赋值的浅拷贝问题):
class poly { public: int vnum; vrtx* vrts; poly(int num) : vnum(num) { vrts = new vrtx[num]; } // 析构函数释放内存 ~poly() { delete[] vrts; } // 可选:拷贝构造函数,避免浅拷贝 poly(const poly& other) : vnum(other.vnum) { vrts = new vrtx[vnum]; // 手动拷贝每个元素 for (int i = 0; i < vnum; ++i) { vrts[i] = other.vrts[i]; } } // 可选:赋值运算符重载 poly& operator=(const poly& other) { if (this != &other) { delete[] vrts; vnum = other.vnum; vrts = new vrtx[vnum]; for (int i = 0; i < vnum; ++i) { vrts[i] = other.vrts[i]; } } return *this; } };
总结一下:不要试图在类的成员声明中用非静态变量定义数组大小,要么用编译时确定的固定值,要么用std::vector这种动态容器,后者是C++中处理动态大小数组的标准做法。
内容的提问来源于stack exchange,提问作者Angus McMillan
相关产品推荐
相关产品推荐

