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

article/2025/10/8 4:34:10

目录

一、报错问题

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

结果: 


http://chatgpt.dhexx.cn/article/v9kYCGMC.shtml

相关文章

error C2057: 应输入常量表达式

提示编译源文件 src\osipparser2\osip_port.c文件出现了问题&#xff0c;找了半天在下图源文件里找到了问题。这提示也是醉了。 解决&#xff1a;修改冲突名称CR为其他名称。 跟osip_port.c没有关系啊&#xff0c;可能是头文件引用导致的吧。

java 常量表达式_JavaSwitch语句:常量表达式是必需的,但它是常量

万千封印 我知道编译器需要在编译时知道表达式才能编译一个开关&#xff0c;但是为什么foo.ba_常数不是呢&#xff1f;虽然从字段初始化后执行的任何代码的角度来看&#xff0c;它们都是常量&#xff0c;但它们不是编译时间常数在JLS所要求的意义上&#xff1b;见15.28常量表达…

C++知识整理系列(三)—— constexpr常量表达式

const修饰常量&#xff0c;但是const并未区分编译时常量和运行时常量&#xff0c;而constexpr则只能是编译时常量&#xff0c;在C11中提出。这篇文章&#xff0c;将详细讲解constexpr。 目录 一、常量表达式二、constexpr变量三、constexpr函数四、字面值类型 五、指针和conste…

C语言中的问号表达式

这道题目中的w<x?w:z<y?z:x 可以写为&#xff1a;w<x?w:(z<y?z:x) 首先z<y真的所以根据口诀真前假后得**(z<y?z:x)z1** 又因为w<x为假&#xff0c;所以得整个表达式为&#xff1a;1

正则表达式-问号(?)的用法

世界上并没有完美的程序&#xff0c;但是我们并不因此而沮丧&#xff0c;因为写程序就是一个不断追求完美的过程。 关于正则表达式&#xff0c;语法简单&#xff0c;但是要完成一个自己想要的逻辑判断就不那么容易了&#xff0c;今天主要讲解问号的一种用法&#xff0c;大家都知…

TypeScript 中问号+点 (?.) 和双问号 (??) 的含义

问号点表达式 (可选链操作符&#xff1a;?.) 例如 let res obj?.arr?.length 等价于 let res obj && obj.arr && obj.arr.length 如果不加问号&#xff0c;光是 obj.arr.length&#xff0c;可能报错没有 length 这个属性&#xff0c;如图&#xff1a; 因…

正则表达式中问号的用法

1、需求背景 由于最近工作需要&#xff0c;要从网页链接中找到网页中有用的博客内容&#xff0c;大家都知道&#xff0c;基本使用正则表达式来匹配是最简单的一种做法&#xff0c;而一般都是div中有div&#xff0c;怎么才能匹配到那些内容的div而不是一直匹配到最后面的div呢?…

问号表达式与逗号表达式问题

问号表达式&#xff1a; #include<stdio.h> void main() {int a,b,c,d,e;c9;d8;scanf("%d,%d",&a,&b);e(a>b)?c:d;printf("%d\n",e); } 可以理解为&#xff0c;如果a>b则ec&#xff0c;否则ed。“”后整体表达式可以看做&#xff08…

JavaScript 中问号的三种用法 ??和?.以及?: 您知道吗?

最近看了一些关于JavaScript的测试脚本&#xff0c;觉得JS 中问号的用法还是蛮有意思的&#xff0c;于是做了一下总结&#xff0c;在这里分享给大家&#xff01;JS中的问号大概有三种用法&#xff0c;分别是&#xff1a;空值合并操作符、可选链操作符和三目运算。 问号问号&…

实验6:shell编程

实验目的 &#xff08;1&#xff09;掌握shell编程的变量、程序控制结构、条件测试等语法。 &#xff08;2&#xff09;了解shell 脚本的运行方式 &#xff08;3&#xff09;理解shell脚本中的函数 &#xff08;4&#xff09;掌握简单shell脚本编写方法实验环境 &#xff08;1&…

shell编程练习题

近来学习到linux的shell编程一块&#xff0c;于是学完后想练习一下。本文就是基于一道练习题来记录一下自己遇到的问题以及解决的过程。 首先看题目&#xff1a;编写shell脚本&#xff0c;要求实现如下功能&#xff1a;当执行一个程序的时候&#xff0c;这个程序会让使用者选择…

Shell编程三剑客

文章目录 前言grep选项 sed 工具概述基本语法常见的 sed 命令选项常见的操作 实验结合正则表达式输出符合条件的文本删除符合条件的文本替换符合条件的文本迁移符合条件的文本 使用脚本编辑文件调用变量来改文件 awk概述工作原理&#xff1a;选项工作原理内置变量关于数组与字符…

Shell编程【万字Shell详细介绍带你入门建议收藏】

文章目录 1 Shell 基础介绍1.1 Shell 简介Shell 概述Shell 发展史查看Shell查看系统默认安装的 Shell查看当前登录用户默认 Shell查看当前的 Shell 1.2 Shell 脚本(定义、作用、格式、权限及执行)Shell 脚本基础知识Shell 脚本的约束Shell 脚本可以完成很多任务&#xff0c;但不…

Linux之Shell编程详解

精心整理Shell编程的入门&#xff0c;并配图加代码&#xff0c;方便大家跟着操作&#xff0c;但是难免不了存在纰漏&#xff0c;感谢大家的指正与理解&#xff01;觉的写的不错的小伙伴儿&#xff0c;一键三连支持一下&#xff0c;后期会有持续更新&#xff01;&#xff01;谢谢…

Linux系统的Shell编程

一. 什么是Shell 1. 在学习Shell编程之前&#xff0c;我们应该要先知道什么是Shell 用户、Shell、Linux内核、硬件的关系如下图&#xff1a; Shell是一个应用程序&#xff0c;也可以说是一个命令解释器&#xff0c;它是用户和Linux内核之间的桥梁&#xff0c;可以将用户在图形界…

Linux中的Shell编程

1.Shell的概念 shell是一个命令行解释器&#xff0c;它为客户提供了一个Linux内核发送请求一边运行程序界面系统级程序&#xff0c;用汉语可以通过shell启动、挂起、停止甚至编写一些程序。 shell还是一个功能强大的编程语言&#xff0c;易于编辑&#xff0c;易于调试&#xff…

Shell编程实验

实验二 Shell编程 文章目录 实验二 Shell编程一、如果当前目录下有文件f1&#xff0c;但是没有f2&#xff0c;解释命令ls f1 f2 2>ef1 1>&2的运行结果。二、使用for循环语句编写一段B-shell程序&#xff0c;完成显示用户注册目录下的a_sub, b_sub子目录下的所有C程序…

Shell编程入门

文章目录 1 Shell编程简介2 Shell脚本的执行方式3 Shell变量3.1 Shell变量介绍3.2 定义变量的规则3.3 将命令的返回值赋给变量&#xff08;重点&#xff09; 4 设置环境变量5 位置参数变量6 预定义变量7 运算符8 条件判断8.1 基本介绍8.2 if 判断8.3 case 语句 9 循环语句9.1 f…

Linux Shell编程

Linux Shell编程 一、简述 简单的介绍shell脚本的基本用法。 shell脚本是 由一些按照一定格式组合起来的shell命令 组成。shell脚本不需要编译就可以直接执行&#xff0c;它是边解释边执行的。 二、命令解释器 Linux系统提供多种不同的Shell以供选择。常用的有Bourne Shell&a…

Shell编程入门学习

文章目录 Shell编程Shell脚本的执行方式Shell的变量Shell的变量的介绍shell变量的定义 设置环境变量位置参数变量介绍基本语法 预定义变量基本介绍基本语法 运算符基本语法 条件判断判断语句常用判断条件 流程控制if 判断case语句for循环while循环 read读取控制台输入基本语法 …