Произвольные значения, возвращаемые функциями-членами класса - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над проектом, состоящим из множества .cxx файлов.Теперь я хочу отредактировать класс, добавив некоторые переменные и функции (которые прокомментированы ниже)

#ifndef TN_LORENTZCHARGEVECTOR_
#define TN_LORENTZCHARGEVECTOR_
#include<iostream>
#include <TLorentzVector.h>

#include "common/Helpers.h"

class LorentzChargeVector : public TLorentzVector
{
public:
    inline LorentzChargeVector()
        : TLorentzVector(),
          _charge(0) {}

    inline LorentzChargeVector(const TLorentzVector &vec,
                               float charge)
        : TLorentzVector(vec),
          _charge(charge) {}

    inline LorentzChargeVector(const LorentzChargeVector &v)
        : TLorentzVector(v),
          _charge(v.Charge()) {}

    inline float Charge() const { return _charge; }
    inline void SetCharge(float charge) { _charge = charge; }
/*
    inline float Trkd0() {std::cout << "fnction" << _trkd0 << std::endl;return _trkd0;}
    inline void SetTrkd0(float trkd0) {std::cout << '\t' << trkd0 << std::endl; _trkd0 = trkd0;std::cout << '\t' << _trkd0 << std::endl;}

    inline float Trkd0sig() {return _trkd0sig;}
    inline void SetTrkd0sig(float trkd0sig) {_trkd0sig = trkd0sig;}

    inline float Trkz0() {return _trkz0;}
    inline void SetTrkz0(float trkz0) {_trkz0 = trkz0;}

    inline float Trkz0sintheta() {return _trkz0sintheta;}
    inline void SetTrkz0sintheta(float trkz0sintheta) {_trkz0sintheta = trkz0sintheta;}
*/
    inline LorentzChargeVector &operator=(const LorentzChargeVector &q)
    {
        TLorentzVector::operator=(q);
        _charge = q.Charge();
        return *this;
    }

    inline LorentzChargeVector operator+(const LorentzChargeVector &q) const
    {
        return LorentzChargeVector(TLorentzVector::operator+(q), _charge + q.Charge());
    }

    inline LorentzChargeVector &operator+=(const LorentzChargeVector &q)
    {
        TLorentzVector::operator+=(q);
        _charge += q.Charge();
        return *this;
    }

    inline LorentzChargeVector operator-(const LorentzChargeVector &q) const
    {
        return LorentzChargeVector(TLorentzVector::operator-(q), _charge - q.Charge());
    }

    inline LorentzChargeVector &operator-=(const LorentzChargeVector &q)
    {
        TLorentzVector::operator-=(q);
        _charge -= q.Charge();
        return *this;
    }

    inline LorentzChargeVector operator-() const
    {
        return LorentzChargeVector(TLorentzVector::operator-(), -_charge);
    }

    inline Bool_t operator==(const LorentzChargeVector &q) const
    {
        return (Vect() == q.Vect() && T() == q.T() && Charge() == q.Charge());
    }

    inline Bool_t operator!=(const LorentzChargeVector &q) const
    {
        return (Vect() != q.Vect() || T() != q.T() || Charge() != q.Charge());
    }

    // Print
    inline void Print(Option_t *option="") const override
    {
        UNUSED(option)

        Printf("(x,y,z,t)=(%f,%f,%f,%f) (P,eta,phi,E)=(%f,%f,%f,%f) charge=%f",
               X(), Y(), Z(), E(),
               P(), Eta(), Phi(), E(), _charge);
    }


private:
    float _charge;
//    float _trkd0;
//    float _trkd0sig;
//    float _trkz0;
//    float _trkz0sintheta;

    ClassDefOverride(LorentzChargeVector, 1);
};

#endif // TN_LORENTZCHARGEVECTOR_

Мои проблемы здесь связаны с функциями, которые возвращают значения.Функции, которые устанавливают значение (SetTrkd0 ecc.), Работают нормально.Вместо этого функции, которые возвращают значение (Trkd0, Trkd0sig ecc.), Дают мне произвольное значение.

Я думаю, что ошибка связана с конструкторами , которыене редактируется для новых переменных.

1 Ответ

0 голосов
/ 04 февраля 2019

Ваш конструктор должен явно инициализировать все члены, иначе он будет хранить неопределенные значения, которые вы воспринимаете как мусор (произвольные значения).В вашем случае _trkd0, _trkd0sig, _trkz0, _trkz0sintheta остаются неинициализированными.

Также, пожалуйста, рассмотрите возможность разделения реализации и объявления класса.Это может позволить вам изменить реализацию независимо от интерфейса, и это может быть проще при работе с требованиями к изменениям, как в вашем случае.

...