Return vala 中的 int 引用
Return int reference in vala
我有一个包含字段的 class,我想调用此 class 的方法并获取对其中一个字段的引用(不是值!!)。像这样:
class Test : Object{
uint8 x;
uint8 y;
uint8 z;
uint8 method(){
if (x == 1){
return y;
}else if (x == 2){
return z;
}
}
public static void main(string[] args){
uint8 i = method(); // get reference to y or z
i++; //this must update y or z
}
}
在 C 中将是:
int& method()
{
if (x == 1){
return y;
}else if (x == 2){
return z;
}
}
我如何在 vala 中实现这个?
编辑:我正在尝试使用指针,我有以下内容
public class Test : Object {
private Struct1 stru;
struct Struct1{
uint8 _a;
public uint8 a{
get{ return _a; }
set{ _a = value; }
}
public Struct1(Struct1? copy = null){
if (copy != null){
this._a = copy.a;
}else{
this._a = 0;
}
}
public uint8* get_aa(){
return (uint8*)a;
}
}
public void get_pointer(){
uint8* dst = stru.get_aa();
}
public static int main (string[] args){
Test t = new Test();
return 0;
}
}
但是当我编译时我得到
/home/angelluis/Documentos/vala/test.vala.c: In function ‘test_struct1_get_aa’:
/home/angelluis/Documentos/vala/test.vala.c:130:11: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
result = (guint8*) _tmp1_;
^
Compilation succeeded - 2 warning(s)
为什么?我正在返回一个 uint8* 类型,并尝试将它存储在一个 uint8* 指针中。
C 没有引用(C++ 有)。请记住,Vala 作为中间语言编译为 C。
我认为在 Vala 中只有两种方法可以做到这一点:
使用框类型封装您的 uint8 值和return对该框类型的引用。
使用指针。 (这会打开明显的 蠕虫指针罐 )
编辑:对更新后的示例代码问题的回答:
你必须非常小心将某些东西转换为某种指针类型。在这种情况下,C 编译器捕获了您的虚假转换并发出警告。
uint8 _a;
// This property will get and set the *value* of _a
public uint8 a{
get{ return _a; }
set{ _a = value; }
}
public uint8* get_aa(){
// Here you are casting a *value* of type uint8 to a pointer
// Which doesn't make any sense, hence the compiler warning
return (uint8*)a;
}
请注意,您无法获得指针或对 属性 的引用,因为属性本身没有内存位置。
在这种情况下,您可以获得指向字段 _a
的指针:
public uint8* get_aa(){
return &_a;
}
如果你坚持要通过属性,你必须让你的属性也对指针进行操作:
uint8 _a;
public uint8* a{
get{ return &_a; }
}
请注意,在此版本中我删除了 get_aa ()
方法,该方法现在等同于 a
的 getter。
此外,由于在此代码中 属性 是 return 指针,因此不需要 setter,您只需取消引用指针即可设置值。
我有一个包含字段的 class,我想调用此 class 的方法并获取对其中一个字段的引用(不是值!!)。像这样:
class Test : Object{
uint8 x;
uint8 y;
uint8 z;
uint8 method(){
if (x == 1){
return y;
}else if (x == 2){
return z;
}
}
public static void main(string[] args){
uint8 i = method(); // get reference to y or z
i++; //this must update y or z
}
}
在 C 中将是:
int& method()
{
if (x == 1){
return y;
}else if (x == 2){
return z;
}
}
我如何在 vala 中实现这个?
编辑:我正在尝试使用指针,我有以下内容
public class Test : Object {
private Struct1 stru;
struct Struct1{
uint8 _a;
public uint8 a{
get{ return _a; }
set{ _a = value; }
}
public Struct1(Struct1? copy = null){
if (copy != null){
this._a = copy.a;
}else{
this._a = 0;
}
}
public uint8* get_aa(){
return (uint8*)a;
}
}
public void get_pointer(){
uint8* dst = stru.get_aa();
}
public static int main (string[] args){
Test t = new Test();
return 0;
}
}
但是当我编译时我得到
/home/angelluis/Documentos/vala/test.vala.c: In function ‘test_struct1_get_aa’:
/home/angelluis/Documentos/vala/test.vala.c:130:11: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
result = (guint8*) _tmp1_;
^
Compilation succeeded - 2 warning(s)
为什么?我正在返回一个 uint8* 类型,并尝试将它存储在一个 uint8* 指针中。
C 没有引用(C++ 有)。请记住,Vala 作为中间语言编译为 C。
我认为在 Vala 中只有两种方法可以做到这一点:
使用框类型封装您的 uint8 值和return对该框类型的引用。
使用指针。 (这会打开明显的 蠕虫指针罐 )
编辑:对更新后的示例代码问题的回答:
你必须非常小心将某些东西转换为某种指针类型。在这种情况下,C 编译器捕获了您的虚假转换并发出警告。
uint8 _a;
// This property will get and set the *value* of _a
public uint8 a{
get{ return _a; }
set{ _a = value; }
}
public uint8* get_aa(){
// Here you are casting a *value* of type uint8 to a pointer
// Which doesn't make any sense, hence the compiler warning
return (uint8*)a;
}
请注意,您无法获得指针或对 属性 的引用,因为属性本身没有内存位置。
在这种情况下,您可以获得指向字段 _a
的指针:
public uint8* get_aa(){
return &_a;
}
如果你坚持要通过属性,你必须让你的属性也对指针进行操作:
uint8 _a;
public uint8* a{
get{ return &_a; }
}
请注意,在此版本中我删除了 get_aa ()
方法,该方法现在等同于 a
的 getter。
此外,由于在此代码中 属性 是 return 指针,因此不需要 setter,您只需取消引用指针即可设置值。