C++ 自定义类的STL容器不';t持有会员资格';s值
在自定义类中使用容器时遇到问题。每次我尝试创建一个对象并推送它时,推送对象中的成员变量显示为零。因此,myConnection.value显示为0而不是其值。我怀疑我的复制构造函数有问题 全球定义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
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.顺序,C.从,C. to);“使用以下参数创建一个临时连接
对象”,而不是“使用这些参数调用其他构造函数”。"移除析构函数可能不是一个好主意。他声明他的是虚拟的,但编译器生成的不是。必须为STL向量编写?呃?@Misha,要求是“对象必须是可复制的”,除非你处理原始内存分配、生存时间等,让编译器来做。必须为STL向量编写?呃?@Misha,要求是“O”对象必须是可复制的,除非您处理原始内存分配、生存期等,否则让编译器来做。