C++ 自定义类的STL容器不';t持有会员资格';s值

C++ 自定义类的STL容器不';t持有会员资格';s值,c++,class,stl,vector,copy-constructor,C++,Class,Stl,Vector,Copy Constructor,在自定义类中使用容器时遇到问题。每次我尝试创建一个对象并推送它时,推送对象中的成员变量显示为零。因此,myConnection.value显示为0而不是其值。我怀疑我的复制构造函数有问题 全球定义 vector<connection> Connections; 连接.cpp #include "../include/connection.h" #include <stdio.h> connection::connection(double kin, double ord

在自定义类中使用容器时遇到问题。每次我尝试创建一个对象并推送它时,推送对象中的成员变量显示为零。因此,myConnection.value显示为0而不是其值。我怀疑我的复制构造函数有问题

全球定义

vector<connection> Connections;
连接.cpp

#include "../include/connection.h"
#include <stdio.h>
connection::connection(double kin, double orderin, int fromin,int toin)
{
    k=kin;
    order=orderin;
    from = fromin;
    to=toin;
printf("%d %d %i %i\n",kin,orderin,fromin,toin);

}

connection::~connection()
{
    //dtor
}

connection::connection(const connection &c)
{
    connection(c.k,c.order,c.from,c.to);
}
输出

100 1 1 2
1 2 1 1
1 2 1 450294344
0 0 (null) 0
100 1 2 3
2 3 2 1
2 3 2 450294376
0 0 0 1
0 0 (null) 0
100 1 1 3
1 3 1 1
1 3 1 450294440
0 0 0 1
0 0 0 1
0 0 (null) 0

复制构造函数使用指定的值创建一个临时的
连接
实例,并立即销毁它,使新复制构造的对象完全未初始化。正确的惯用复制构造函数应该是:

connection::connection(const connection& c)
  : k(c.k),
    order(c.order),
    from(c.from),
    to(c.to)
{ }
这就是说,值得注意的是,在这种情况下,实际上根本不需要复制构造函数——因为您不需要担心任何数据成员分配/生存期问题(阅读:没有原始指针),编译器将为您生成一个理想的构造函数(析构函数也是如此)。因此,这里最好的修复方法就是完全去掉复制构造函数(和析构函数)


与实际问题无关,请注意,您应该更喜欢成员初始值设定项列表,而不是构造函数中的赋值。因此,这比您当前的构造函数更可取:

connection::connection(double kin, double orderin, int fromin, int toin)
  : k(kin),
    order(orderin),
    from(fromin),
    to(toin)
{
    printf("%f %f %i %i\n", k, order, from, to);
}

(还要注意,
%d
是一个无效的格式说明符,用于
double

您的复制构造函数使用指定的值创建一个临时
连接
实例,并立即销毁它,使新复制构造的对象完全未初始化。正确的惯用复制构造函数应该是:

connection::connection(const connection& c)
  : k(c.k),
    order(c.order),
    from(c.from),
    to(c.to)
{ }
这就是说,值得注意的是,在这种情况下,实际上根本不需要复制构造函数——因为您不需要担心任何数据成员分配/生存期问题(阅读:没有原始指针),编译器将为您生成一个理想的构造函数(析构函数也是如此)。因此,这里最好的修复方法就是完全去掉复制构造函数(和析构函数)


与实际问题无关,请注意,您应该更喜欢成员初始值设定项列表,而不是构造函数中的赋值。因此,这比您当前的构造函数更可取:

connection::connection(double kin, double orderin, int fromin, int toin)
  : k(kin),
    order(orderin),
    from(fromin),
    to(toin)
{
    printf("%f %f %i %i\n", k, order, from, to);
}

(还要注意,
%d
对于
double
是无效的格式说明符)

您几乎不应该自己编写副本构造函数。如果有疑问,不要这样做。您需要编写一个的情况有:

  • 当你有一个非空的析构函数时
  • 当您要防止复制时

    • 您几乎不应该自己编写副本构造函数。如果有疑问,不要这样做。您需要编写一个的情况有:

      • 当你有一个非空的析构函数时
      • 当您要防止复制时

      你忽略了一个重要的细节——“代码>连接< <代码>的定义是什么?你忽略了一个重要细节——<代码>连接< <代码>的定义是什么?要详细说明,在当前的C++版本中,没有办法从另一个调用中调用一个构造函数,所以编译器正在解释代码<代码>连接。(c.k,c.order,c.from,c.to);作为“使用以下参数创建一个临时
      连接
      对象”,而不是“使用这些参数调用其他构造函数”移除析构函数可能不是一个好主意。他声明了它是虚拟的,但是编译器生成的不是一个。在当前的C++版本中,没有必要从另一个调用中调用一个构造函数,所以编译器正在解释代码<代码>连接(C.K,C.顺序,C.从,C. to);“使用以下参数创建一个临时
      连接
      对象”,而不是“使用这些参数调用其他构造函数”。"移除析构函数可能不是一个好主意。他声明他的是虚拟的,但编译器生成的不是。必须为STL向量编写?呃?@Misha,要求是“对象必须是可复制的”,除非你处理原始内存分配、生存时间等,让编译器来做。必须为STL向量编写?呃?@Misha,要求是“O”对象必须是可复制的,除非您处理原始内存分配、生存期等,否则让编译器来做。