未设置为对象实例的对象引用.我需要构造函数吗?

本文关键字:构造函数 对象引用 设置 对象 实例 | 更新日期: 2023-09-27 18:15:30

这里是OOP初学者,我的问题是当我到达这个事件时:

    private void button1_Click(object sender, EventArgs e)
    {
        progressBar2.Increment(-25);
        splitContainer1.Panel1.Enabled = false;
        Thread.Sleep(2100);
        int preAttack = myCurrentOpponent.SetAttack();
        oppAttack = myCurrentOpponent.Attack(preAttack);
        progressBar1.Increment(oppAttack.dommage);
        textBox1.Text += myCurrentOpponent.Name + "Used " + oppAttack.AttackName;
    }

我得到一个错误:对象引用未设置为对象的实例。你需要知道的事情myCurrentOpponent是一个在3个怪物类型的集合中随机选择的对象。我将在这个例子中使用咕噜,它是3种类型之一。咕噜从怪物那里继承并覆盖了名字等级生命值预攻击SetAttack

    public abstract class Monster
{
    public abstract string Name { get; }
    public abstract int Lv { get; }
    public abstract int Hp { get; }
    public abstract int SetAttack();
    public abstract Attack Attack(int x);

    public Monster()
    {
    }
}

这里没有设置,因为:

    public class Gollum : Monster
{
    Attack[] myAttack = new Attack[4];
    public override string Name
    {
        get
        {
            return "Gollum";
        }
    }
    public override int Hp
    {
        get
        {
            return 100;
        }
    }
    public override int Lv
    {
        get
        {
            return 3;
        }
    }
    public override int SetAttack()
    {
        Random randnum = new Random();

        int x = randnum.Next(5);
        myAttack[0].AttackName = "Charge";
        myAttack[0].dommage = -10;
        myAttack[1].AttackName = "Scratch";
        myAttack[1].dommage = -12;
        myAttack[2].AttackName = "Throw Rock";
        myAttack[2].dommage = -15;
        myAttack[3].AttackName = "Strangle";
        myAttack[3].dommage = -16;
        return x;
    }
    public override Attack Attack(int x)
    {
        return myAttack[x];
    }
    public Gollum()
    {
    }

一切都设置在3个怪物子类中。现在,假设选择的怪物是咕噜,我点击按钮1,当编译器到达这一行时…

     myAttack[0].AttackName = "Charge";

…从这行呼叫…

    int preAttack = myCurrentOpponent.SetAttack();

…我得到了错误。我错过了构造函数为我的咕噜类 ?如果我是,我怎么能编码因为所有东西都是直接在属性中设置的。我真的希望有人能帮我,因为我真的不知道去哪里找。希望这足够清楚,如果您需要更多的代码行,请不要犹豫。提前感谢

未设置为对象实例的对象引用.我需要构造函数吗?

您在类的顶部声明了您的数组

 Attack[] myAttack = new Attack[4]; 

但是所有这些都是创建一个有4个槽的数组,每个槽由类型的默认值填充。对于类,该默认值将为空。您需要初始化这些槽。对于数组,通常可能在循环中执行此操作。

for (int index = 0; index < myAttack.Length; index++)
{
    myAttack[index] = new Attack();
}

由于数组的元素没有实例化,当您试图访问元素的成员时,您会在运行时遇到NullReferenceException

您还没有用任何对象填充数组myAttack。当你初始化数组时,它是用null引用创建的。您需要在出现错误的行之前添加这些行:

myAttack[0]=new Attack();
myAttack[1]=new Attack();
myAttack[2]=new Attack();
myAttack[3]=new Attack();

这将用一个新的Attack对象初始化每个数组条目,以便您现在可以在它们上设置属性。