如何在C ++类中提供外部定义的函数?

我有一个与Armadillo包一起使用的类,用于创建特定类型的矩阵。我在调试它时遇到了麻烦,因此我想使用我编写的名为Matlab_Print的函数。它位于自己的.h.cpp文件中,并在我的代码中使用。类和函数都可以正常工作,但是我似乎无法将它们组合在一起。

在类定义之前和之后,我都在#include "Matlab_Print"中尝试过SU3.h。我真的不想让函数成为类函数,因为我经常使用Matlab_Print。我确实有一种解决方法,但是它很不方便,无论如何我都将其视为学习的机会。

在调用try构造函数时,我用SU3捕获错误消息,并且得到以下信息:

  

错误:Mat :: init():大小固定,因此无法更改

main.cpp

#include "pch.h"
#include <new>
#include <exception>
#include "SU3.h"

int main(int argc,char *argv[])
{
    int icount { 0 };
    SU3 *su3[10];

    try
    {
        for (icount = 0; icount < 10; icount++)
        {
            su3[icount] = new SU3(0.1);
        }
    }
    catch (int param) { cout << "Function " << __func__ << " int " << param << " exception in memory allocation for su3" << std::endl; exit(1); }
    catch (char param) { cout << "Function " << __func__ << " char " << param << " exception in memory allocation for su3" << std::endl; exit(1); }
    catch (...) { cout << "Function " << __func__ << " exception in memory allocation for su3" << std::endl; exit(1); }

    return 0;
}
SU3.h

#include "pch.h"
#include "SU3.h"
#include <armadillo>
#include "Matlab_Print.h"

class SU3
{
public:
    arma::Mat<cx_double>::fixed<3,3> *X;
    SU3(const double epsilon);
};
SU3.cpp

SU3::SU3(const double epsilon)  // simplifed so that epsilon plays no role
{
    const std::complex<double>    o{ 1.0,0.0 };    // complex 1
    const std::complex<double>    z{ 0.0,1.0 };    // complex 0

    X = new arma::Mat<cx_double>::fixed<3,3>{ fill::zeros }; //// solution to problem: define and initialize pointer ////

    *X =    {   { o,z,z},{ z,o,o} };

    Matlab_Print(*X,"SU3");        // this is the line I wish to use
}
Matlab_Print.h

#include <armadillo>
#include <complex>

void Matlab_Print(arma::Mat<cx_double>::fixed<3,3> Matrix,std::string T);
Matlab_Print.cpp

#include "pch.h"
#include "Matlab_Print.h"

void Matlab_Print(arma::Mat<cx_double>::fixed<3,std::string T)
{
    std::cout << std::endl;

    std::cout << "RE = [" << std::real(Matrix(0,0)) << "   " << std::real(Matrix(0,1)) << "   " << std::real(Matrix(0,2)) << ";   ";
    std::cout << std::real(Matrix(1,0)) << "   " << std::real(Matrix(1,1)) << "   " << std::real(Matrix(1,2)) << ";   ";
    std::cout << std::real(Matrix(2,0)) << "   " << std::real(Matrix(2,1)) << "   " << std::real(Matrix(2,2)) << "];  " << std::endl;

    std::cout << "IM = [" << std::imag(Matrix(0,0)) << "   " << std::imag(Matrix(0,1)) << "   " << std::imag(Matrix(0,2)) << ";   ";
    std::cout << std::imag(Matrix(1,0)) << "   " << std::imag(Matrix(1,1)) << "   " << std::imag(Matrix(1,2)) << ";   ";
    std::cout << std::imag(Matrix(2,0)) << "   " << std::imag(Matrix(2,1)) << "   " << std::imag(Matrix(2,2)) << "];  " << std::endl;

    std::cout << T << " = RE + 1i*IM;" << std::endl;
}

感谢您的耐心配合。我希望这就是您需要的所有信息。

l5600666 回答:如何在C ++类中提供外部定义的函数?

正如@uneven_mark所指出的,您在SU3::SU3中有未定义的行为,因为您要引用X而不先对其进行初始化。您可能不需要在这里的指针。

不需要不需要new来创建类类型的对象。

class SU3
{
public:
    arma::Mat<cx_double>::fixed<3,3> X;
    SU3(const double epsilon);
};

using namespace std::literals::complex_literals;

SU3::SU3(const double epsilon)
  : X({ { 1,1i,1i },{ 1i,1,1 } }) // prefer member initialisers over assingments
{
    Matlab_Print(X,"SU3");
}
本文链接:https://www.f2er.com/3113613.html

大家都在问