‘this’不能用于常量表达式错误(C++)【问题解决】

目录

一、报错问题

1、代码

test.h

test.cpp

2、问题描述

二、网上解决思路

三、解决方案


                                                【元旦快乐🌹,新年快乐🎉】

        最近在编译程序时出现了“ ‘this’不能用于常量表达式错误(C ++)”的报错问题,查阅多位博主写的文章后,发现他们并没有直接给出很好的解决方案,故此我在这里将自己的问题现象以及解决方案梳理一遍。

一、报错问题

1、代码

        简单写了个测试例子:

test.h

#pragma once

#ifndef _TEST_H_
#define _TEST_H_

#include <stdlib.h>
#include <stdio.h>

class A
{
public:
    A(int nx, int ny);
    void printValue();
private:
    int width, height,num;
};
#endif // !_TEST_H_

test.cpp

#include "test.h"

A::A( int nx, int ny)
{
    width = nx;//初始化
    height = ny;
    num = width * height;
}

void A::printValue()
{
    int img[num];
    for (int i = 0; i < num; i++)
    {
        img[i] = i;
    }//简单赋值

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            printf("value: %d\n",img[i*width+j]);
        }
    }
}

2、问题描述

        以上代码编译发生如题的报错。

         以上逻辑是在主函数中直接给类初始化,其私有成员即得到赋值,然后再使用。但是代码写出来后就是存在这样的错误,该如何处理?

二、网上解决思路

        看了网上好几篇文章,却都没有直接给出解决方案。倒是有提出是什么原因导致的问题。

博文1中指出,在C++中,类的构造方法里面调用私有变量去定义数组,而在类创建的时候调用构造方法,此时还没有加载变量,即当我们创建一个对象或变量时,直到构造函数完成初始化过程,对象或变量才能真正取得其常量属性。

博文2中提出两种方法:1、采用宏定义方法,如果采用#define来定义变量则不满足我们想要动态传递参数的功能。2、使用std::vector - std::vector - cppreference.com这个对于我们来说似乎就过于复杂和舍近求远了。

三、解决方案

        我的解决方法也比较简单,既然num是不固定数字,不可直接定义数组,那么我们在内存上创建内存呀,使用new/malloc来创建num大小的内存块,进行使用。使用完后记得释放内存即可。

        修改以上对应位置的代码:

void A::printValue()
{
    //int img[num];
    int* img = new int[num];//修改
    for (int i = 0; i < num; i++)
    {
        img[i] = i;
    }//简单赋值

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            printf("value: %d\n",img[i*width+j]);
        }
    }
    delete[] img;
    img = NULL;
}

测试代码:

#include "test.h"

using namespace std;

int main()
{
	A a(3, 4);
	a.printValue();

	return 0;
}

结果: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanke_yh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值