K
So,
ich denke ich habe es jetzt:
Der Kopierkonstruktor kann leider nicht kopieren, aber mit dem Inhalt des zu kopierenden Objekts bin ich in der Lage im neuen Objekt neu zu initialisieren.
Anbei noch der move constructor und move assignment operator.
Jetzth habe ich doch aber alles, oder nicht?
Und die magische Zeile 57
acc(rhs.acc),spline(rhs.spline)
funktioniert nun, weil ich interpolation als Rvalue caste? Als Lvalue würde es einfach die Adresse des einen Pointers in den anderen schreiben.
/*
interpolation.h
*/
#ifndef INTERPOLATION_H_
#define INTERPOLATION_H_
#include <iostream>
#include <vector>
#include <gsl/gsl_spline.h>
#include <gsl/gsl_errno.h>
struct interpolation
{
interpolation();
interpolation(std::vector<double>, std::vector<double>);
interpolation(const interpolation&);
interpolation& operator=(const interpolation&);
interpolation& operator=(interpolation&&);
interpolation(interpolation&&);
~interpolation();
double operator()(double);
std::vector<double> x,y;
gsl_interp_accel *acc;
gsl_spline *spline;
};
#endif
/*
interpolation.cpp
*/
#include <iostream>
#include "interpolation.h"
/*
---{}--- default constructor ---{}---
*/
interpolation::interpolation():x(),y(),
acc(nullptr),spline(nullptr)
{}
/*
---{}--- constructor ---{}---
*/
interpolation::interpolation(std::vector<double> x, std::vector<double> y):
x(x), y(y),
acc(gsl_interp_accel_alloc()),
spline(gsl_spline_alloc(gsl_interp_cspline,x.size()))
{
gsl_spline_init(spline,x.data(),y.data(),x.size());
}
/*
---{}--- copy constructor ---{}---
*/
interpolation::interpolation(const interpolation& rhs):
x(rhs.x),y(rhs.y),
acc(gsl_interp_accel_alloc()),
spline(gsl_spline_alloc(gsl_interp_cspline,x.size()))
{
gsl_spline_init(spline,x.data(),y.data(),x.size());
}
/*
---{}--- assignment operator ---{}---
*/
interpolation& interpolation::operator=(const interpolation& rhs)
{
if( this != &rhs)
{
gsl_interp_accel_free(acc);
gsl_spline_free(spline);
x.clear();
y.clear();
x = rhs.x;
y = rhs.y;
acc = gsl_interp_accel_alloc();
spline = gsl_spline_alloc(gsl_interp_cspline,x.size());
gsl_spline_init(spline,x.data(),y.data(),x.size());
}
return *this;
}
/*
---{}--- move constructor ---{}---
*/
interpolation::interpolation(interpolation&& rhs):
x(rhs.x),y(rhs.y),
acc(rhs.acc),spline(rhs.spline)
{
rhs.acc = nullptr;
rhs.spline = nullptr;
}
/*
---{}--- move assignment operator ---{}---
*/
interpolation& interpolation::operator=(interpolation&& rhs)
{
if( this != &rhs)
{
gsl_interp_accel_free(acc);
gsl_spline_free(spline);
x.clear();
y.clear();
x = rhs.x;
y = rhs.y;
acc = gsl_interp_accel_alloc();
spline = gsl_spline_alloc(gsl_interp_cspline,x.size());
gsl_spline_init(spline,x.data(),y.data(),x.size());
rhs.x.clear();
rhs.y.clear();
gsl_interp_accel_free(rhs.acc);
gsl_spline_free(rhs.spline);
rhs.acc = nullptr;
rhs.spline = nullptr;
}
return *this;
}
/*
---{}--- destructor ---{}---
*/
interpolation::~interpolation()
{
gsl_interp_accel_free(acc);
gsl_spline_free(spline);
}
/*
---{}--- operator() ---{}---
*/
double interpolation::operator() (double x)
{
return gsl_spline_eval(spline,x,acc);
}
Gruß,
-- Klaus.