自定义类的STL容器不包含成员的值

时间:2011-06-09 21:22:16

标签: c++ class stl vector copy-constructor

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

全球定义

vector<connection> Connections;

故障点

    while ( dataInput.good() )
{
    getline (dataInput,line);
    sscanf(line.c_str(),"%lg %lg %d %d",&k,&order,&final,&initial);
    printf("%lg %lg %d %d\n",k,order,final,initial);//Looks Good
    Connections.push_back(connection(k,order,final,initial));
    printf("%lg %lg %s %d\n",Connections[i].k,Connections[i].order,Connections[i].to,Connections[i].from);//Everything is zero!?
    i++;
}

Connection.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);
}

Connection.h

#ifndef CONNECTION_H
#define CONNECTION_H


class connection
{
public:
    connection(double, double, int,int);
    connection(const connection& c);
    virtual ~connection();
    double k;
    double order;
    //From which mass to which mass
    int from;
    int to;
};

#endif // CONNECTION_H

输出

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

2 个答案:

答案 0 :(得分:7)

您的copy-constructor创建一个具有指定值的临时connection实例,并立即销毁它,使新构建的对象完全未初始化。一个正确的,惯用的拷贝构造函数将是:

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);
}

(另请注意,%ddouble的无效格式说明符。)

答案 1 :(得分:2)

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

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