C++的结构体指针中出错:表达式必须是可修改的左值_最后发现解决方法很简单

本来用指针用的好好的

一直以来(用了2个星期c++),类里直接写类指针,直接初始化没啥问题

private:
	//D3D类
	D3DClass* mD3D;
mD3D = new D3DClass*

结果今天要做数据转换,必须是结构体(也有好处,比类要写头文件,CPP文件写2个文件多类啊,结构体也容易理解一点),结果就拉风了,死活说不可修改的左值


public:
    FrameBufferType* lastBuffer;

上网搜了一下,可能的解决方案包括

1.指针赋值

int * p ;

p = (int *) 4;

p* = *xxx;

首先,且不说实战中你根本不会用int,而是

其次,我是真见过一个名牌大学生写这么“复杂的”代码

第一弱智是:Hello World程序

第二弱智就是:这种 int 代码

下面还有更弱智的:

解决方法,在于第五(想用 struct(指针) 换掉原来的类(指针),两者初始化还不通用)

2.左值赋值

等号左边是左值,右边是右值,左边需要是变量,

1 = x;//这样肯定提示左值不可修改

我想,只要读过小学的都不会说出这样的干话吧,

上CSDN的人,都聪明人,肯定是要初始化变量,用变量储存一些数据

3.结构体的初始化应该这样初始化

当然,上面的截图貌似没有初始化问题,反而又是另一个问题

字符数组不能用“=”赋值给另一数组,即name=str是不行的。

不确定是不是我用 visulstudio编译的原因,

如果我们按这么写,即使没有数组问题,第一行初始化都编译不过的,提示的是:

使用了未被初始化的变量

本来不想展开说,但特么用了C++两个星期,首先发现2个重要问题

1.各种include异常,找不到文件(分开头文件和CPP惹得锅)

2.最简单的指针(反射)判断都做不到,编译必须从上到下编译(也无法避免各种宏翻转)

好吧,这些都不重要,c++快啊,功能强大啊,编程思想啊

(40年前肯定比C好才创造出来的,还叫c plus plus ,一般都叫A+,它也有先见之名,叫++)

但我就想问问,

1.要字串没字串

2.要数组没数组(上面截图不是明摆着么)

3.各种指针也不确定是有赋值还是没赋值

到底C++能干啥

夸平台啊,25%的程序员都在用,世界第一语言

(我听到的是,此地无银三百两)

4.尝试了以下3个方法,却不成功

	//1.使用了未初始化的局部变量 's'
	//FrameBufferType* s;
	//s->View = matrixPtr->View;
	// 2.可以的分配??
	//lastBuffer = malloc(sizeof(struct FrameBufferType));
    //3.局部变量确实可以(cpp内局部)
	//FrameBufferType* xx = (struct FrameBufferType*)malloc(sizeof(struct FrameBufferType));
	

其实,解决有3个线索

指针可以赋值

地址可以赋值

const指针不能改变,因为const就是不能改变(const 又是一个我不知道为什么要存在的东西,40年前的386电脑,内存不够,必须用const限定?写程序这么多年,发现限定除了发挥限定本身的作用,对效率,整体运行,对团队协作,对扩展开发等等其他功能根本是影响,鸡肋,是对const最贴切的评价)

5.最后突然发现,原来这么简单

class FrameCBuffer : public CBuffer
{
	FrameBufferType* lastBuffer = new FrameBufferType;

只要给个默认值,只能在头文件默认,

确实应该在头文件声明结构指针,应该编译的逻辑判断同const............

遗留问题

  • 会不会占用内存
  • 编译会不会变慢
  • 包体会增加嘛

网上很多牛人吐槽都在等编译,边喝咖啡边等编译,半天都在看书+编译,看来每个人都认为是错的东西,一般对不了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++ 表达式必须是可修改左值是一种限制,是为了确保程序的正确性和安全性。如果表达式不是可修改左值,将会导致编译错误。 如果需要修改一个非可修改左值,可以考虑使用指针或引用的方式来间接修改指针和引用都是 C++ 常用的解决方案,可以有效地解决表达式必须是可修改左值的限制。 下面是一个使用指针修改非可修改左值的示例: ```c++ #include <iostream> int main() { const int a = 1; int* ptr = const_cast<int*>(&a); //使用 const_cast 将 const int* 转换为 int* *ptr = 2; //修改指针指向的值 std::cout << a << std::endl; //输出 1,a 的值没有被修改 std::cout << *ptr << std::endl; //输出 2,指针指向的值被修改了 return 0; } ``` 这里使用 const_cast 将 const int* 类型的指针转换为 int* 类型的指针,然后通过指针修改原本不可修改左值。需要注意的是,这种方式只适用于非常量类型的左值,对于常量类型的左值修改是不被允许的。 除了使用指针,还可以使用引用的方式来修改非可修改左值,例如: ```c++ #include <iostream> int main() { const int a = 1; const int& ref = a; //使用 const 引用 int& ref2 = const_cast<int&>(ref); //使用 const_cast 将 const 引用转换为非 const 引用 ref2 = 2; //修改引用指向的值 std::cout << a << std::endl; //输出 1,a 的值没有被修改 std::cout << ref << std::endl; //输出 2,引用指向的值被修改了 return 0; } ``` 这里使用 const 引用来引用 a,然后使用 const_cast 将 const 引用转换为非 const 引用,最后通过引用修改原本不可修改左值。需要注意的是,这种方式也只适用于非常量类型的左值,对于常量类型的左值修改是不被允许的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

avi9111

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

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

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

打赏作者

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

抵扣说明:

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

余额充值