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

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

目录

一、报错问题

1、代码

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、问题描述
以上代码编译发生如题的报错。

image.png

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

二、网上解决思路

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

博文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;
}

结果:
image.png

————————————————
版权声明:本文为CSDN博主「nanke_yh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nanke_yh/article/details/128466375

目录
相关文章
|
1月前
|
Python
什么是语句?什么是表达式?怎么区分?
编程语言中的语句和表达式是基础概念。语句是执行操作或命令的代码行,如Python的`print("Hello, World!")`,通常以换行符结束。表达式则表示值或计算过程,如`2 + 2`,可赋值给变量或用于计算。语句侧重于执行动作,表达式侧重于计算值。表达式可含运算符、变量等,而语句由主语和谓语构成。示例中,`x = 10`和`print("Hello, World!")`是语句,`y = x + 5`和`result = a * b + c`是表达式。
|
1月前
|
存储 C语言
变量和常量的例子
变量和常量的例子
11 1
|
1月前
|
存储 程序员 编译器
C++注释、变量、常量、关键字、标识符、输入输出
C++注释、变量、常量、关键字、标识符、输入输出
|
11月前
|
C语言
学C的第二天(变量‘补充’;简单了解常量,字符串,转义字符,注释,if选择语句,while循环语句)(1)
4.4*变量的使用(上期继续补充): 字符类型: %c - 字符类型 %d - 整型 %s - 字符串 %f - float类型 %lf - double类型
|
1月前
|
索引 Python
完美解决丨#在python中,如果引用的变量未定义,则会报告NameError: name ‘变量名‘ is not defined。
完美解决丨#在python中,如果引用的变量未定义,则会报告NameError: name ‘变量名‘ is not defined。
|
1月前
|
编译器 C语言 C++
C/C++未定义行为的例子汇总
C/C++未定义行为的例子汇总
|
10月前
|
安全 C语言
【C语言】 变量 -- 常量 -- 转义字符
【C语言】 变量 -- 常量 -- 转义字符
|
存储 编译器 Linux
关于枚举常量手误带来的错误
关于枚举常量手误带来的错误
75 0