С++ добавление std :: pair в базовый класс шаблона

129
16

У меня странное поведение в коде C++. У меня есть абстрактный базовый класс Symbolic:

template <class C, class E>
class Symbolic
{
protected:
vector<pair<C, E> > monomials;
public:
virtual ~Symbolic() {}

virtual ostream &print(ostream &o) const = 0;
virtual void add_monomial(C, E) = 0;
};

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

class Theta2 : public Symbolic<Complex, double>
{
protected:
size_t n;

public:
Theta2(size_t n);
Theta2(const Theta2 &);

~Theta2();
ostream& print(ostream &) const;

void add_monomial(Complex c, double e);

};

ostream & operator<<(ostream &, const Theta2 &);

И это фактическая реализация метода:

void Theta2::add_monomial(Complex c, double e)
{
this->monomials.push_back(make_pair(c, e));
}

Комплекс - это тип, который я реализовал как оболочку для библиотеки GNU MPC.

И так я называю метод:

int main (int argc, char **argv)
{
Theta2 t2(7);

cout << "Adding monomials" << endl;

t2.add_monomial(Complex(1), 0);
t2.add_monomial(Complex(2), 1);
t2.add_monomial(Complex(3), 2);
t2.add_monomial(Complex(4), 3);
t2.add_monomial(Complex(5), 4);
t2.add_monomial(Complex(6), 5);

cout << "Theta2:" << t2 << endl;

return EXIT_SUCCESS;
}

Моя фактическая проблема заключается в том, что моя программа выводит "Добавление мономов", но затем завершается без сообщения об ошибке. Я отлаживал программу и вызывает метод add_monomials, но завершает работу после push_back.

EDIT: Это мое сложное определение:

enum ComplexPart {REAL, IMAG};

class Complex {

private:
mpc_t c;

public:
static const mpfr_prec_t PREC;

Complex();
Complex(long double re);
Complex(long double re, long double im);
Complex(const Complex &);

virtual ~Complex();

void add(const Complex &other);
Complex add(const Complex &other) const;

string get_mpfr_string(mpfr_t number, size_t digits) const;
string get_cplx_part(ComplexPart which, size_t digits) const;

Complex &operator=(const Complex &);

virtual ostream& print(ostream &o) const;

};

ostream &operator<<(ostream &o, const Complex &c);

И это реализация:

const mpfr_prec_t Complex::PREC = 1024;

Complex::Complex()
{
mpc_init2(this->c, Complex::PREC);
}

Complex::~Complex()
{
mpc_clear(this->c);
}

Complex::Complex(const Complex &other)
{
mpc_set(this->c, other.c, MPC_RNDNN);
}

Complex::Complex(long double re)
{
mpc_init2(this->c, Complex::PREC);
mpc_set_ld(this->c, re, MPC_RNDNN);
}

Complex::Complex(long double re, long double im)
{
mpc_init2(this->c, Complex::PREC);
mpc_set_ld_ld(this->c, re, im, MPC_RNDNN);
}

Complex &Complex::operator=(const Complex &c)
{
mpc_set(this->c, c.c, MPC_RNDNN);
return *this;
}

спросил(а) 2021-01-19T15:29:37+03:00 8 месяцев назад
1
Решение
79

Спасибо всем комментаторам. Это Решение. Проблема заключалась в отсутствии инициализации mpc_t c в моем конструкторе копирования:

Complex::Complex(const Complex &other)
{
mpc_init2(this->c, Complex::PREC);
mpc_set(this->c, other.c, MPC_RNDNN);
}

ответил(а) 2021-01-19T15:29:37+03:00 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема