5

我有一个叫做扑克牌的类,它继承自卡片类。我将它实例化为一个名为chuckcards 的对象。数据成员之一是 CARD ID。我正在尝试为该值分配一个 int 。它在类中被声明为公共的。这是它的实例化方式。

playingcards[] chuckcards = new playingcards[10];

这是我尝试分配值的方式。

for (int ctr = 1; ctr < 10; ctr++)
        {

            chuckcards[ctr].cardID =  ctr;

            temp++;
        }

我得到的错误是

你调用的对象是空的。

我不知道我做错了什么?我可以制作一个将值分配给每个成员的方法吗?如果是这样,那对某些事情来说会很痛苦,但我能做到吗?还是他们的简单方法?

4

5 回答 5

7

当您调用 时new playingcards[10],它只会创建具有该类型默认值的占位符,该类型null用于引用类型。您将不得不实际更新扑克牌才能使用它

    for (int ctr = 1; ctr < 10; ctr++)
    {
        chuckcards[ctr] = new playcards{cardID=ctr};
        temp++;
    }

我也使用了对象初始化器将代码简化为一行。

这是发生的事情:

var chuckcards = new playingcards[10];

结果如下:

chuckcards[0] = null
...
chuckcards[9] = null

所以,你不能做

chuckcards[0].cardID

因为它真的

null.cardID

所以,一旦你初始化了这个值,它就会有一个引用:

chuckcards[0] = new playingcards();
chuckcards[0].cardID = ctr;

评估为

[ref to playingcards].cardID

这是有效的

于 2013-04-24T13:18:07.923 回答
5

您已经定义了一个包含 10 个插槽的数组来保存扑克牌的实例,但每个插槽仍然为空
在进入循环之前,您需要在每个插槽中添加一个实例

 chuckcards[0] = new  playingcards();

等等..... (1,2,...9=最大索引)

最终,您可以检查循环内部是否已将实例分配给特定插槽

 for (int ctr = 0; ctr < 10; ctr++)
 {
    if(chuckcards[i] != null)
    {
        chuckcards[ctr].cardID =  ctr;
        temp++;
    }
 }

请记住,数组索引从零开始,而不是从一开始

于 2013-04-24T13:18:21.077 回答
4

您需要提供chuckcards[ctr]一个对象实例:

chuckcards[ctr] = new playingcards();
chuckcards[ctr].cardID = ctr;
于 2013-04-24T13:18:07.553 回答
3

chuckcards[ctr] 为空,你必须实例化它

playingcards[] chuckcards = new playingcards[10];

for (int ctr = 0; ctr < 10; ctr++)
{
   chuckcards[ctr] = new playingcards();
   chuckcards[ctr].cardID =  ctr;
}
于 2013-04-24T13:19:05.360 回答
2

卡盘卡[ctr] 为空。你需要实例化它。

for (int ctr = 1; ctr < 10; ctr++)
{
    chuckcards[ctr] = new playingcards();
    chuckcards[ctr].cardID =  ctr;
    temp++;
}

为了减少代码,您可以创建另一个需要 id 的构造函数。然后你有:

for (int ctr = 1; ctr < 10; ctr++)
{
    chuckcards[ctr] = new playingcards(ctr);
    temp++;
}
于 2013-04-24T13:23:25.657 回答