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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:50:29