Swapping a base and derived class giving unexpected results.
So I have two classes Item and Armor I have written the following code to swap when the player tries to equip some armor:
private void Switch(Armor a, Item i)
{
Debug.Log ("a.id = " + a.ID);
Debug.Log ("i.id = " + i.ID);
Item temp = a.asItem ();
a.Assign(i); //armor is derived from base class item
i = temp;
Debug.Log ("a is now = " + a.ID);
Debug.Log ("i is now = " + i.ID);
}
public void equipHead()
{
if (player.inHand.isOfType (1))
{
Switch(Head, player.inHand);
}
}
//from Armor.cs
public void Assign( Item I1)
{
if (!DataLoaded)
LoadData ();
Stack_Size = I1.Stack_Size;
curStack = I1.curStack;
Name = I1.Name;
ID = I1.ID;
Type = I1.Type;
Durability = I1.Durability;
Quality = I1.Quality;
statsLoaded = false;
}
public Item asItem()
{
Item t = new Item ();
t.Type = Type;
t.Name = Name;
t.ID = ID;
t.Stack_Size = 1;
t.curStack = 1;
t.Durability = Durability;
t.Quality = Quality;
return t;
}
if I click with an empty hand on an empty armor slot I get the expected: a.id = 0 i.id = 0 a is now = 0 i is now = 0
if I click with a cloth helmet I get the expected
a.id = 0 i.id = 1 a is now = 1 i is now = 0
Now if I click with an empty hand to remove the armor
a.id = 1 //expected i.id = 1 //wth? a is now = 1 i is now = 1
I don't know what is going on I thought this is how I could swap items, but clearly it is doing something in the background that I am not expecting. I don't even think I should need to have a function to convert armor to an item to work a straight assignment with casting should have worked. I know it has got to be something simple maybe someone else will see my mistake and point it out for me.
Never $$anonymous$$d! I was making the assumption that unity passed everything as pointers, but apparently it copies everything. Just needed a couple refs - C# makes me miss C++ at times.
Well, object instances are passed by reference. But it's passing the actual reference, not a pointer to the reference. So when you assign the parameter to something that doesn't affect the caller at all. $$anonymous$$ind of like if you were passing an int
variable or something.
If you want to change the value and have the caller see that then yes, you need to pass a reference to the reference :) (which is effectively what you're doing in C++ when you pass a pointer to a pointer). It makes perfect sense, and is much more logically consistent than C++. But those are probably fighting words.
Your answer
![](https://koobas.hobune.stream/wayback/20220612033334im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Child class cannot access property in method? 1 Answer
Trouble with inheritance 2 Answers
Create a list of BaseType where different supertypes are contained. 0 Answers
Not sure how to make my classes interact in the way I intend them to 1 Answer
Always wondered how to sync animations with attack effects 0 Answers