Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法叫会员';C+中的s getter/setter+;没有括号? 我想运行一些GLSL代码 AS >强> C++代码,由包含了,在C++应用程序中,不进行修改。它没有特殊的杂注等等,但它有一些向量类型。例如vec3和vec4,分别表示3和4个浮点数的元组,这在内存中是重叠的,便于执行某些线性代数任务_C++_Oop_Operator Overloading_Overloading_Getter Setter - Fatal编程技术网

有没有办法叫会员';C+中的s getter/setter+;没有括号? 我想运行一些GLSL代码 AS >强> C++代码,由包含了,在C++应用程序中,不进行修改。它没有特殊的杂注等等,但它有一些向量类型。例如vec3和vec4,分别表示3和4个浮点数的元组,这在内存中是重叠的,便于执行某些线性代数任务

有没有办法叫会员';C+中的s getter/setter+;没有括号? 我想运行一些GLSL代码 AS >强> C++代码,由包含了,在C++应用程序中,不进行修改。它没有特殊的杂注等等,但它有一些向量类型。例如vec3和vec4,分别表示3和4个浮点数的元组,这在内存中是重叠的,便于执行某些线性代数任务,c++,oop,operator-overloading,overloading,getter-setter,C++,Oop,Operator Overloading,Overloading,Getter Setter,几乎所有的事情都可以通过操作符重载来完成,除了一件事。 考虑 VEC4 A有4个浮动成员: A.X, A.Y., A.Z.< /代码>和 A.W. >p> 在glsl中,有一种流行的符号a.xyz,意思是“取a.x,a.y,a.z,并从中构造vec3。” 有些语言,比如面向对象的Pascal(Delphi)版本,有这样的功能:这些成员是用属性关键字定义的。所以,当编译器遇到它时,它会调用getter,当它遇到assignment时,它会调用setter,一切看起来都像是在读或写一个常规成员变量

几乎所有的事情都可以通过操作符重载来完成,除了一件事。 考虑<代码> VEC4 A<代码>有4个浮动成员:<代码> A.X,<代码> A.Y.<代码>,<代码> A.Z.< /代码>和<代码> A.W.<代码> >p> 在glsl中,有一种流行的符号
a.xyz
,意思是“取
a.x,a.y,a.z
,并从中构造vec3。”

有些语言,比如面向对象的Pascal(Delphi)版本,有这样的功能:这些成员是用
属性
关键字定义的。所以,当编译器遇到它时,它会调用getter,当它遇到assignment时,它会调用setter,一切看起来都像是在读或写一个常规成员变量

如何在C++中编写这样的代码?< /P>
在代码中,我想这样编写getter:

vec4 a(1,2,3,4);
auto b = a.xyz; // b = a.get_xyz();
vec4 a(1,2,3,4);
a.xyz=vec3(5,6,7); // a.set_xyz(vec3(5,6,7));
b
现在属于
vec3
类型,并且具有
x==1
y==2
z==3

像这样的塞特人:

vec4 a(1,2,3,4);
auto b = a.xyz; // b = a.get_xyz();
vec4 a(1,2,3,4);
a.xyz=vec3(5,6,7); // a.set_xyz(vec3(5,6,7));
a
现在有
x==5
y==6
z==7
w==1



<>强>我怎么能支持这样的语法?<强> < /p> < p>这是一个令人悲哀的事实,这样一个成熟、强大、广泛使用的C++语言没有<代码>属性支持。就连德尔福也。。幸运的是,我成功地解决了任务(编译CalthGLSL着色器作为C++而不修改GLSL源代码)。我认为它不会有与创建代理对象相关的速度/内存损失,并且可以由编译器轻松优化(尽管这不是必需的)

我找到了以下解决方案:

#包括
#pragma包(推送,4)
vec3类{
公众:
浮动x,y,z;
vec3(){}
vec3(浮动x、浮动y、浮动z):
x(x),y(y),z(z)
{}
};
第4类{
公众:
联合{
结构{
浮动x,y,z,w;
};
vec3-xyz;
};
vec4(){}
vec4(浮动x、浮动y、浮动z、浮动w):
x(x),y(y),z(z),w(w)
{}
};
#布拉格语包(流行语)
int main(){
{
vec4a(1,2,3,4);
自动b=a.xyz;//b=a.get_xyz();

STD::我从来没有在C++中看到过。在设置器的情况下,我想一个可以为这个类型超载运算符=…但是我几乎不认为这是个好主意。看来你在寻找像C语言或Delphi这样的语言支持的属性语法。C++不支持这个。你可以在C++中做一些类似C属性的事情。Michael Litvin sho席:他的回答是一个例子。但是我不建议你这么做。它不是惯用的C++。你不能仅仅在C++中发明新的语法,不。ῥεῖ 刚才问到,可能是新标准中的新功能。顺便说一下,你可能不会将C#与Delphi进行比较。因为C#起源于解释器(更像是msdos的qbasic模拟器玩具)。Delphi是pascal扩展(turbo/borland pascal,最初直接编译为16位asm)更像是C/C++——支持那些用指针、位操作等低级别的特性。Delphi只是最接近的“正常”语言(不是java/C·…)支持属性。我看不出C++ C++ 19仍然缺少这样的语法糖的原因。注意C++不允许(未定义的行为)。给一个工会成员写信,从另一个工会成员那里阅读。@Eljay感谢您的重要通知。如果您手头有一个解决方案,请随时发布另一个可能的解决方案。只需复制我的
main()
函数-它必须不经修改就可以工作,产生相同的输出(就像TIO的
gcc
一样)速度和内存使用是没有任何一致性的(这是理论上的)。在罗马,我会用GETER和SETTER方法来使用括号,因为C++的形式不会混淆任何其他C++开发人员。我会使用<代码> VEC3 XYZ()const < /C>作为吸气剂,同时提供<代码> XYZ(VEC3)< /C>和<代码> XYZ(浮点X,浮点Y,浮点Z)。
作为setter。虽然我的任务是使vec3和vec4都不可变,setter将是返回新的vec3或vec4的工厂——但这完全是另一个主题。@Eljay现在想象一下window.title..它对您来说一定是一个字符串。
window.title=“Hello”在C++中,似乎是最明显的……哦,对不起,甚至是对非程序员……在引擎盖下,在Win32 API上,它甚至不是变量!你必须调用<代码> StWinWOWTEXTA(HWND,NeWinWOWITHECT.CYSTRE())<代码>:更糟糕的是:你想像<代码> STD::String S(256,‘0’);Auto NexLeN= GETWOWDOWTEXTA(HWND,和S(0),S siz());s.resize(纽伦);return s;
所有这些可能也应该作为nice
窗口的
title
属性公开。@Eljay这是一个动机示例。根据任务,您的变量不起作用。它在
auto b=a.xyz
语句中给出编译错误,该语句的内容为:错误C3867:'vec4::xyz':非标准语法;使用“&”来create是一个指向成员的指针,因此我不能接受它作为解决方案。