【问题标题】:Don't understand why the constructor is called twice不明白为什么构造函数被调用了两次
【发布时间】:2017-04-27 16:06:35
【问题描述】:

我是 C++(和编程)的新手,我编写了以下代码:

主要:

int main(){
  aircraft_list<planes> plane_list;
  plane_list.add();
}

飞机的构造函数:

planes::planes(){
  //initializing some vars
}

添加():

template <class T> aircraft_list<T>& aircraft_list<T>::add(){
  chain_node<T> *y=new chain_node<T>;
  planes obj;
  y->data=obj;
  y->link=first;
  first=y;
  return *this;
}

aircraft_list 的构造函数:

aircraft_list(){
    first=0;
  }

aircraft_list 的析构函数:

template <class T> aircraft_list<T>::~aircraft_list(){
  chain_node<T> *next;
  while(first){
    next=first->link;
    delete first;
    first=next;
  }
}

从上一个问题中,我研究了三规则并修复了析构函数的问题,但我仍然不明白为什么构造函数被调用两次...当我注释掉时:

planes obj;
y->data=obj;

构造函数被调用一次......它创建的对象会发生什么?

编辑:

aircraft_list class:

template <class T>
class aircraft_list{
friend class planes;

public:
  aircraft_list(){
    first=0;
  }
  ~aircraft_list();
  int search(const T &x) const;
  aircraft_list<T>& del(const T &x);
  aircraft_list<T>& add();

private:
  chain_node<T> *first;
};

chain_node 类:

template <class T> class aircraft_list;
template <class T> class chain_node{

public:
  T data;
  chain_node<T> *link;
};

【问题讨论】:

  • 不要使用新的和自定义的列表
  • 好吧,我做这个是为了一个任务,我必须创建一个
  • 当你调用 plane_list.add();新对象的构造函数在 add() 函数中运行
  • 如果您也提供类定义会有所帮助。从您发布的内容中我无法确定,但我猜chain_node&lt;T&gt; 的构造函数创建了一个T

标签: c++


【解决方案1】:

简单地说:你至少有两个飞机物体。

一个定义在

  planes obj;

这很容易发现。 另一个有点难,它是在一些你实际上没有粘贴到这里的代码中。

  chain_node<T> *y = new chain_node<T>;

因为你的chain_node有一个T类型的数据,而T是planes类型,当你创建一个chain_node,而chain_node的结构体上有一个planes时,它也会创建一个新的planes实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2013-01-12
    • 2020-06-29
    • 2011-01-02
    相关资源
    最近更新 更多