Контейнер пользовательских классов STL не содержит значений членов - PullRequest
1 голос
/ 10 июня 2011

У меня проблемы с использованием контейнера с моим пользовательским классом.Каждый раз, когда я пытаюсь создать объект и нажать на него, переменные-члены в объекте push отображаются как ноль.Таким образом, 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 ]

7 голосов
/ 10 июня 2011

Ваш конструктор копирования создает временный экземпляр connection с указанными значениями и немедленно уничтожает его, оставляя вновь созданный объект копирования полностью неинициализированным.Правильный идиоматический конструктор копирования будет выглядеть так:

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

Тем не менее, стоит отметить, что в этом случае вам вообще не нужен конструктор копирования - потому что у вас его нетПроблемы с распределением / временем жизни членов данных (читай: без сырых указателей), компилятор сгенерирует идеальный для вас (то же самое касается и вашего деструктора).Итак, лучшее решение здесь - это просто полностью избавиться от вашего конструктора копирования (и деструктора).


Не имеет отношения к вашей реальной проблеме, обратите внимание, что вы должны предпочесть, чтобы member-initializer-lists присваивался вконструкторы.Таким образом, это будет предпочтительнее вашего текущего конструктора:

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.)

2 голосов
/ 10 июня 2011

Вы почти никогда не должны сами писать конструктор копирования.Если сомневаешься, не делай этого.Случаи, когда вам нужно будет написать один:

  • , когда у вас есть непустой деструктор
  • , когда вы хотите предотвратить копирование
...