未设置为对象实例的对象引用.我需要构造函数吗?
本文关键字:构造函数 对象引用 设置 对象 实例 | 更新日期: 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
对象初始化每个数组条目,以便您现在可以在它们上设置属性。