2:瞧,这是UE4 C++

Posted on 2014-10-06 18:02  neocsl  阅读(2474)  评论(1编辑  收藏  举报

  紧接着上面学到的指针和域名空间我们继续逛Unreal 4 wiki。

  1.怪形 T

  在自己很早学习编程的时候看到过匈牙利表示法,记得是微软的开发者Charles提出来的,尽管看起来很美好但是从来没有遵循过。

  其实那些前缀T就是这回道理。UE4 有自己的定义类,所以我们的标题不叫C++学习。

  TArray

  TSharedRef

  TWeakPtr

  TArray

  之类,带前缀T表示Template class,前缀能让你轻易地区分变量名。

  UE4中的T前缀变量应该让你想起两件东西

  ①一种游戏类型

  ②一种变量类型

  当然UE4中还有T,F,U,A,I等前缀去这里看Epic's Naming Conventions

  

  2.你的痛:指针

  伙计,*和&到底是什么东西?怎么用?着实让我头大:S

  这也是新手学习C++最难得地方了吧,但是一旦你掌握了指针你将会快乐的编写UE4 C++了

  总的来说指针既强大又危险,指针需要你成为一位勤勉的人,与之换来的将赋予你速度和力量。对,就像葵花宝典一样。你得有挥刀的决心XD

  

  ①一个指针必须指向一个数据存储的存储地址

  ②为了获取地址你就得使用&

  FVector Location=FVector(1,2,9000);

  FVector* LocationPtr;

  LocationPtr=&Location;

  ③访问数据前,永远检测你的指针

  Check(LocationPtr);

  或者

  if(!LocationPtr)return;

  你必须这样做,因为你永远不知道什么时候指针中存储的值是有效的

  你可以重定向

  Fvector NewVector=FVector::ZeroVector;

  if(LocationPtr)

  {

    NewVector=*LocationPtr;   //重定向指针
  }

  if(!LocationPtr)return;

  const float XValue=LocationPtr->X;

 

  3.总结:为什么使用指针?

  有很多人喜欢看总结篇,因为貌似总结篇很能讲一些道理,这次我们也不例外:)

  ①指针能让你获取地址,试想一下你当前在编写context,但是要访问一个不是这个context的变量,地址能给你很快的传回

  ②指针还能让你获取大量的数据,从而避免还得创建复制这一类型

  ③指针给你一种活链接,无论你的数值怎么变化,指针都无需更新因为它仅仅是一个指向。就像超级链接一样,你尽管修改自己的网页,URL给我~

  

  Example:我们来获取一个超级超级远的数据

  假设你有一个角色类,他是众多银河,子星系的星球的一部分,我们仅仅是要获取他的盔甲,估计你会这样作:

  GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor();

  上边的访问是不是看起来都很废?虽然能解决问题

  

  如果只做一次指针指代能好一点?

  FArmorStruct* TheArmor=& GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor();

  既然做了一次指代你就不需要再写下面的代码了:

GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor().Durability;
GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor().Color;
GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor().Size;
  瞧,为了偷懒我都直接复制过来了。
  这样不仅难读,同时又浪费CPU时间
  
然后你会这样写
  
if(!TheArmor) return; //永远检测指针
TheArmor->Durability;
TheArmor->Color;
TheArmor->Size;

  上述使用了指针,你或许会问,为什么我不是用FArmorStruct ArmorVar=
GetGalaxy()->GetSolarSystem()->GetPlanet()->GetMainCharacter()->GetCurrentArmor();


  而是使用指针?
  假设一下,若果有众多数据你将会进行大量的赋值拷贝。我在写iCLoud的时候因为不能将多object直接传送到云端谢了大量代码变量抄写,这可真的非常痛苦。除此之外这些数据就写在一片连续的内存中。
  第二点是,你将会失去前面说的链接功能,本地的变量修改了,你的指针完全能抄写回来,因为他是一种链接记着吗