当我无法将函数本身设为静态时如何调用非静态函数

Posted

技术标签:

【中文标题】当我无法将函数本身设为静态时如何调用非静态函数【英文标题】:How to call a non-static function when I cannot make the function itself static 【发布时间】:2022-01-17 17:22:11 【问题描述】:

作为 uni 作业的一部分,我需要在 C# 中创建一个自助结账模拟并添加一个附加功能 - 在本例中是一个会员卡积分系统。

我创建了一个将持有积分的成员类,但我试图让我的 winforms UI 在单击扫描会员卡按钮时显示成员名称。

GetName() 函数如下 -

class Members
    
        // Attributes
        protected int membershipID;
        protected string firstName;
        protected string lastName;
        protected int clubcardPoints;

        // Constructor
        public Members(int membershipID, string firstName, string lastName, int clubcardPoints)
        
            this.membershipID = membershipID;
            this.firstName = firstName;
            this.lastName = lastName;
            this.clubcardPoints = clubcardPoints;
        

        // Operations
        public string GetName()
        
            string name = firstName + " " + lastName;
            return name;
        
        ...
    

这是来自 UserInterface.cs 中 UpdateDisplay 函数的 sn-p。

    void UpdateDisplay()
    
        // DONE: use all the information we have to update the UI:
        //     - set whether buttons are enabled
        //     - set label texts
        //     - refresh the scanned products list box

        if (selfCheckout.GetCurrentMember() != null)
        
            lblMember.Text = Members.GetName();
        
        ...
     

Members.GetName() 不能用,因为不是静态函数,但是不知道能不能转成静态函数。让这个工作的最佳方法是什么?

感谢任何帮助,我希望它有意义!对此很新,所以我不确定我的措辞是否正确。

【问题讨论】:

所以你想要lblMember.Text = selfCheckout.GetCurrentMember().GetName() 【参考方案1】:

你能打电话给selfCheckout.GetCurrentMember().GetName()

【讨论】:

这个人太明显了,现在我看到了,我很生气,我花了好几个小时在这上面……谢谢!【参考方案2】:

Members.GetName() 不能使用,因为它不是静态函数

发生此错误是因为GetName 方法是实例的成员。但是你称它为静态成员。要将其称为实例成员,您应该这样做:

var currentMember = selfCheckout.GetCurrentMember(); //to make both check for null and call methods, you should firstly create variable with this object
if (currentMember  != null)

    lblMember.Text = currentMember.GetName(); // if current member is not null, call GetName

【讨论】:

【参考方案3】:

它不起作用,因为您不是引用对象而是引用实例,您可以将成员类设置为静态或先获取当前成员。

【讨论】:

以上是关于当我无法将函数本身设为静态时如何调用非静态函数的主要内容,如果未能解决你的问题,请参考以下文章

关于类中静态成员函数和静态成员变量的知识点

如何从 Qt/C++ 的子函数中调用非静态父函数?

MFC中静态成员函数调用其他类的非静态变量

C++之静态

在另一个线程上调用非静态类函数

调用 UIViewController 类的非静态函数