指针问题?这个问题?上课问题?

时间:2016-02-25 05:27:55

标签: c++ class pointers this

#include <iostream>
using namespace std;

class Item
{
private:
   string name;
  int power;
  int durability;
public:
  Item(string n, int p, int d);
  void Describe() const;
  ~Item();
};

Item::Item(string n, int p, int d)
{
  name = n; power = p; durability = d;
}

我也无法显示此功能......我怎么称呼它?

void Item::Describe() const
{
  cout << name << " (power=" << power << ", durability=" << durability << ")\n";
}

Item::~Item()
{
  cout << "** Item " << name << " is being deallocated." << endl;
}

class Warrior
{
private:
  string name;
  int level;
  string profession;
  Item *tool;
public:
  Warrior(string n, int l, string p);
  Warrior(const Warrior& otherObj);
  void GiveTool(string toolName, int toolPower, int toolDurability);
  void Describe() const;
};

Warrior::Warrior(string n, int l, string p)
{
  name = n;
  level = l;
  profession = p;
}

Warrior::Warrior(const Warrior& otherObj)
{
  if(otherObj.tool != NULL)
   this->tool = new Item(*(otherObj.tool));
else
    this->tool = NULL;
}

问题似乎在这里我认为...... 所以这就是我想做的事。

如果工具为NULL意味着战士没有工具给他一个工具。 但是,如果他确实有工具,则取消分配工具变量 而是给他这个工具。

void Warrior::GiveTool(string toolName, int toolPower, int toolDurability)
{
    if(tool == NULL)
    this->tool = new Item(toolName,toolPower,toolDurability);

    else
 {
    cout << name << "'s existing tool is being replaced." << endl;
    delete tool;
    this->tool = new Item(toolName,toolPower,toolDurability);
  }
}

然后我将如何显示新分配的工具...... 它会像我在这里做的那样“工具”吗? 因为当我运行程序时,它会显示地址而不是内存。

void Warrior::Describe() const
{
  cout << name << " is a level " << level << " " << profession << endl;
  if(tool != NULL)
  {

    cout << "His tool is: ";
    cout <<tool;
    cout << "....";
  }
    else
  {
    cout << "No tool\n";
  }
}

int main()
{
    Warrior a("Stephen Curry", 30, "NBA Player");
    a.GiveTool("Basketball", 50, 20);
    a.Describe();
    a.GiveTool("Football", 10, 20);
    a.Describe();
}

我认为输出应该是这样的:

史蒂芬库里是一名30级NBA球员

他的工具是:Bastketball

Stephen Curry现有的工具正在被替换。

项目篮球正在解除分配。

史蒂芬库里是一名30级NBA球员

他的工具是:足球

提前谢谢!任何事都会有所帮助。我对这个编程很新 世界,在阅读我的代码时请记住这一点...... 再次感谢任何帮助谢谢!

3 个答案:

答案 0 :(得分:1)

class Warrior中,工具是一个指针 - Item *tool。因此,使用*来获取对象。

接下来,为了能够使用流打印类Item的对象,您应该重载<<运算符。另一种方法是为该类定义get_name()方法:

const std::string & Item::get_name() const
{
  return name;
}

此函数返回对name字段的常量引用,这比返回完整副本更有效,并防止在类之外进行可能的修改。同样,该方法是常量,这意味着不能在其中修改任何值。 然后,你可以这样写:    cout << tool->get_name()

答案 1 :(得分:1)

您可以使用Item个对象编写程序,而不是指向Item的指针,而不会出现您甚至没有出现的大部分问题。

说完这个之后,你的代码有几个问题:

  1. 您未在3参数tool构造函数中初始化NULLnullptr(更好,Warrior)。
  2. 您没有将Warrior复制构造函数中的所有成员从传入的对象复制到
  3. 您缺少Warrior的析构函数。
  4. 您缺少Warrior::operator=的作业运算符(Warrior)。
  5. 第一期:

    Warrior::Warrior(string n, int l, string p) : 
                     name(n), level(l), profession(p), tool(nullptr) {}
    

    请注意成员初始化列表的用法。

    第二期:

    Warrior::Warrior(const Warrior& otherObj) :  
    name(otherObj.name), level(otherObj.level), profession(otherObj.profession), tool(nullptr)
    {
      if (otherObj.tool)
         tool = new Item(*(otherObj.tool));
    }
    

    请注意,使用传入对象的成员初始化所有成员。

    第三个问题:

    Warrior::~Warror() { delete tool; }
    

    第四个问题:使用copy / swap idiom的赋值运算符应如下所示:

    #include <algorithm>
    //...
    Warrior& Warrior::operator=(const Warrior& w)
    {
       Warrior temp(w);
       std::swap(temp.tool, tool);
       std::swap(temp.name, name);
       std::swap(temp.level, level);
       std::swap(temp.profession, profession);
       return *this;
    } 
    

    总结一下:

    1. 如果您的类包含指向动态分配内存的指针,并且您要在程序中复制此对象,则应尊重rule of 3。你没有通过Warrior中缺少赋值运算符和析构函数来做到这一点。如果不遵守此规则,将导致程序中出现未定义的行为。
    2. 编写用户定义的复制构造函数时,应复制所有成员,而不仅仅是一个或两个成员。拥有对象的部分副本是诊断最棘手的错误之一。复制所有成员的规则的一个主要例外是您的对象被引用计数。
    3. 构造对象时,应将指针成员初始化为某种状态(通常为nullptr)。

答案 2 :(得分:0)

  

我也无法显示此功能......我如何称呼它?

tool->Describe();  // From the Warrior class

首先检查nullptr。