目录
一、报错问题
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;
}
结果: