c++ - 在模板类的构造函数末尾调用的模板的析构函数
问题描述
我正在处理的模板类有一些问题。这是我的类的定义(我只保留了错误来自的基本部分):
Sampler.h
#ifndef SAMPLER_H
#define SAMPLER_H
#include "matrix.h"
#include "MatrixOperations.h"
template <class T>
class Sampler
{
public:
virtual T getnumber()=0;
};
const Matrix ZEROS = zeros_mat(1,1);
const Matrix UNIT = unit_mat(1);
class NormalSampler_multi:public Sampler<Matrix>
{
public:
virtual Matrix getnumber();
NormalSampler_multi(Matrix m=ZEROS, Matrix VarCovar=UNIT);
void printMean();
void printVar();
private:
Matrix mu;
Matrix var;
};
#endif
和 cpp 文件:
Sampler.cpp
#include "Sampler.h"
#include"matrix.h"
#include "MatrixOperations.h"
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
NormalSampler_multi::NormalSampler_multi(Matrix m, Matrix VarCovar){
if(m.get_nbColumns()>1 && m.get_nbRows()>1){
cout << "The mean should be a 1d-matrix\n";
exit(EXIT_FAILURE);
}
if(VarCovar.isSymmetric()==false){
cout << "The Variance-Covariance matrix should be symmetric\n";
exit(EXIT_FAILURE);
}
mu = m;
var = VarCovar;
}
void NormalSampler_multi::printMean(){mu.print_matrix();}
void NormalSampler_multi::printVar(){var.print_matrix();}
Matrix NormalSampler_multi::getnumber(){//Not implemented yet};
这是我的问题。当我运行以下代码时:
main.cpp
#include <iostream>
#include <math.h>
#include <cstdlib>
#include <time.h>
using namespace std;
#include "matrix.h"
#include "MatrixOperations.h"
#include "Sampler.h"
int main(){
//Vector of means
Matrix mean(5,1);
for(int i=0;i<5;i++){
mean(i,0) = i;
}
//Creation of the multidimensional sampler
NormalSampler_multi Z(mean, variance);
cout << "Print of the mean after assignment:" << endl;
Z.printMean();
cout << "Print of the variance after assignment" << endl;
Z.printVar();
return 0;
}
and的值与andmu
的var
值不同(应该如此)。当我查看它时,我发现类的析构函数是在构造函数的末尾调用的。所以我猜它删除了 and 的值,但我真的不明白为什么以及如何解决它。mean
variance
Matrix
NormalSampler_multi
mu
sigma
Matrix 类的(基本部分)定义如下:
Matrix.h
#ifndef MATRIX_H
#define MATRIX_H
class Matrix{
public:
Matrix(int nbRows=0, int nbColumns=0);
Matrix(const Matrix& a);
~Matrix();
//Access to elements
double& operator()(int i, int j);
int get_nbRows(void) const;
int get_nbColumns(void) const;
//Useful functions
void print_matrix(void);
protected:
int n; //Number of rows
int p; //Number of columns
double **pt; //Pointer to elements
};
#endif // MATRIX_H
及其实施:
Matrix.cpp
#include "matrix.h"
#include "MatrixOperations.h"
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <cmath>
using namespace std;
Matrix::Matrix(int nbRows, int nbColumns){
n = nbRows;
p = nbColumns;
pt = new double*[n];
for(int i=0; i<n; i++){
pt[i] = new double[p];}
//Initialize the array to 0
for(int i=0; i<n; i++){
for(int j=0; j<p; j++){
pt[i][j] = 0;
}
}
}
Matrix::Matrix(const Matrix& a){
n = a.n;
p = a.p;
pt = new double*[n];
for(int i=0; i<n; i++){
pt[i] = new double[p];
for(int j=0; j<p; j++){
pt[i][j] = a.pt[i][j];
}
}
}
Matrix::~Matrix(){
cout << "destructor called\n";
delete[] pt;}
int Matrix::get_nbRows(void) const {return n;}
int Matrix::get_nbColumns(void) const {return p;}
double &Matrix::operator()(int i, int j){
if ((i < 0)||(i>=n)||(j < 0)||(j>=p))
{
cout << "Index out of bounds! \n";
exit(EXIT_FAILURE);
}
return pt[i][j];
}
//Print a matrix on the console
void Matrix::print_matrix(void){
cout << "[";
for(int i=0; i<n; i++){
cout << "[";
for(int j=0; j<p; j++){
cout << (*this)(i,j);
if(j<p-1){cout << ",";}
}
cout << "]";
if(i<n-1){cout << ",\n";}
else{}
}
cout << "]\n";
cout << endl;
}
谢谢!
解决方案
NormalSampler_multi(Matrix m, Matrix VarCovar) {
- 参数m
和VarCovar
将在构造函数结束时被销毁。
您的问题可能是由于Matrix
不遵守3/5/0 的规则。由 by 调用的默认生成的赋值运算符mu = m; var = VarCovar;
会进行成员赋值,这会弄乱您的类不变量。你最终得到mu.pt == m.pt
,然后 whenm
被销毁,mu.pt
是一个悬空指针。
一个简单的解决方案是替换pt
为vector<vector<double>>
,然后您的班级将符合零规则。或者,您可以实现正确的赋值运算符。
(脚注 - 可能还有其他问题,这只是一个突出的问题)。
推荐阅读
- javascript - 在 javascript / p5.js 中查找与当前颜色最接近的索引颜色值
- c# - Microsoft Android 模拟器在调试时显示空白表单
- android - 无法解析“:app@debug/compileClasspath”的依赖关系:无法转换工件“lifecycle-viewmodel.aar”
- python - 如何将这些数据与正则表达式匹配?
- linux - 麻烦将 grep 流水线化为排序
- python - 两个相互作用粒子之间的距离小于截止距离
- css - 在 css 计数器中使用第三章,而不是第三章
- json - 在 Json 模式中按名称封装 Root 对象以供重用?
- mysql - 我如何将数据从 reactjs 表单发布到 mysql 数据库
- r - 在r中删除多个带有条件的后续行