吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 889|回复: 14
收起左侧

[求助] 学C++我看培训老师老说修改类里面的变量用函数修改,为什么delphi却相反直接改属性。

[复制链接]
dong555 发表于 2023-5-18 09:38
现在学QT感觉和学delphi的时候对于控件属性的修改完全是2种感觉,学c++用QT的时候培训老师都是特别强调类的变量值修改用函数来修改,说会影响变量值,也确实在QT中界面控件的属性全部用set+属性名的函数来修改值,比如LinEdit控件的txt值就用setTxt修改。   可是以前自己学delphi的时候都是控件属性直接赋值修改的,比如delphi中和QT的LinEdit控件一样的Edit控件,它就是比如 edit.txt:='修改值';
看过很多编程语言也都说类的变量修改值用函数更安全,为什么delphi敢直接修改变量值,个人觉得delphi直接改更方便

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

SysEntry 发表于 2023-5-18 09:53
封不封装都行吧
yes2 发表于 2023-5-18 10:16
我理解的是,如果你的类会被别人用到的话,成员变量最好private,然后提供接口读写,在接口中也可以做一些有效性判断。避免用户使用的时候改坏,提升健壮性。
如果是自己用就无所谓吧,反正你知道啥时候改,应该如何改。
goldli 发表于 2023-5-18 10:16
本帖最后由 goldli 于 2023-5-18 10:21 编辑

谁告诉你delphi的属性值修改是直接改变量值的 ?

任何高级语言,在支持对象的情况下, 对属性的修改都是通过赋值函数 Set{属性名} 来修改值。
你直接在对象外部能修改的应该是一个 public 的 对象字段,
如:
     这个叫字段
     public int Age ;  

   这个叫属性
   private int _age; //属性对应的私有字段
   public int Age {get {return _age;} set { _age = value;} }
 楼主| dong555 发表于 2023-5-18 10:32
goldli 发表于 2023-5-18 10:16
谁告诉你delphi的属性值修改是直接改变量值的 ?

任何高级语言,在支持对象的情况下, 对属性的修改都是 ...

punlic
定义了一个变量不就是公有变量啊 delphi的属性也就是在pulic里面定义了private中私有变量可以读或写,这不就是可以给这个私有变量直接赋值的权限啊 而且delphi这样做对于还要搞个set函数不是更方便。
我是更喜欢delphi的做法
 楼主| dong555 发表于 2023-5-18 10:47
本帖最后由 dong555 于 2023-5-18 10:52 编辑
goldli 发表于 2023-5-18 10:16
谁告诉你delphi的属性值修改是直接改变量值的 ?

任何高级语言,在支持对象的情况下, 对属性的修改都是 ...

其实也像你说的这样间接赋值也比设置一个set函数 get函数方便多了吧
像你这个在delphi中就简洁多了,如果按照C++设置一个set函数 get函数
就要这样写2个函数觉得麻烦
private
    int  age;
public
   void setAge(int a){age=a;}
  int getAge(){return age;}

delhi这样写我看方便多了
private
  age:integer;
published
property aaa:integer read age write age;

JuncoJet 发表于 2023-5-18 10:57
属性只是符号重载,懂C++的应该知道
DEATHTOUCH 发表于 2023-5-18 11:05
确实,用property非常方便,对于简单字段完全不需要写get和set,对于相对复杂的,
可以这样:
[Delphi] 纯文本查看 复制代码
type
  TTest = class
  private
    FAge:Integer;
    procedure SetAge(AValue:Integer);
  public
    property Age:Integer read FAge write SetAge; // 读取直接拿,写入通过SetAge
  end;

procedure TTest.SetAge(AValue:Integer);
begin
  // 这里就可以加入条件判断或做其他事情了
  // if (AValue < 0) then xxxx
end

表面上你还是通过类似test.Age := 20; 这样的赋值,实际上调用的是SetAge
不过这样非常方便,写起来也比较符合逻辑。
你可以看看TEdit.Text,就是封装了TEdit.GetText和TEdit.SetText

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
dong555 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| dong555 发表于 2023-5-18 11:13
本帖最后由 dong555 于 2023-5-18 11:16 编辑
DEATHTOUCH 发表于 2023-5-18 11:05
确实,用property非常方便,对于简单字段完全不需要写get和set,对于相对复杂的,
可以这样:
[mw_shl_co ...

谢谢 c++的编译工具是不是都没有delphi的property这种操作,QT和VS好像都没有 不知道和delphi同根的c++ builder也有没有类似property的操作
DEATHTOUCH 发表于 2023-5-18 11:31
dong555 发表于 2023-5-18 11:13
谢谢 c++的编译工具是不是都没有delphi的property这种操作,QT和VS好像都没有 不知道和delphi同根的c++ b ...

C++是没有property这种的,这个是Delphi的object pascal语言特有的,
不过QT有一个Q_PROPERTY宏,应该是QT自己的扩充,比如:
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged USER true)
这个就是我从QT的QLineEdit里面找到的,不过这个似乎不是给我们用的,你还是不能像Delphi那样用赋值语句。

不过对于C++ Builder来说就不一样了,他们魔改了自己的C++编译器,可以支持这种写法
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        this->Caption = "Hello";
}
比如上面的按钮代码就可以让窗口的标题变成Hello,这是因为他们的C++扩充了__property关键字,
__property int X = {read = readX, write = writeX};
比如上面这个就是从官方文档复制过来的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表