【问题标题】:Calling a method for a class attribute C++调用类属性 C++ 的方法
【发布时间】:2013-05-30 16:36:07
【问题描述】:

我正在创建一个自定义类pi2cma,其中一个对象sigma 来自另一个类作为属性。但是,当我尝试直接在pi2cma 的cpp 文件中用sigma.setMean(MN); 直接调用sigma 的方法时,出现错误:

./src/pi2cma.cpp:54:7: error: ‘((pi2cma*)this)->pi2cma::sigma’ does not have class type

但是,如果我为 pi2cma 类创建一个完全相同的中间方法

void pi2cma::set_MN(Eigen::VectorXd _mean){sigma.setMean(_mean);}

没有错误报告!

如何在我的pi2cma.cpp中直接使用sigma的父类的方法?

编辑:包含在pi2cma.cpp

#include "eigen_multivariate_normal.hpp"
#include "pi2cma.hpp"
#include <iostream>
#include <cmath>
#include <boost/random.hpp>

//aditional libraries for multivariate matrix manipulation
#include <boost/tr1/random.hpp>
#include <Eigen/Dense>
(...)

pi2cma.hpp:

(...)
// mean and covariance matrices
Eigen::VectorXd MN;
Eigen::MatrixXd CVM;

// multivariate normal distribution
Eigen::EigenMultivariateNormal<double,DIM> sigma(Eigen::VectorXd,Eigen::MatrixXd);
(...)

eigen_multivariate_normal.hpp 中的 EigenMultivariteNormal 类:

template<typename Scalar, int Size>
class EigenMultivariateNormal
{
    Matrix<Scalar,Size,Size> _covar;
    Matrix<Scalar,Size,Size> _transform;
    Matrix< Scalar, Size, 1> _mean;
    internal::scalar_normal_dist_op<Scalar> randN; // Gaussian functor

public:
    EigenMultivariateNormal(const Matrix<Scalar,Size,1>& mean,const Matrix<Scalar,Size,Size>& covar)
    {
    setMean(mean);
    setCovar(covar);
    }

    void setMean(const Matrix<Scalar,Size,1>& mean) { _mean = mean; }
    void setCovar(const Matrix<Scalar,Size,Size>& covar) {
        _covar = covar;  
        SelfAdjointEigenSolver<Matrix<Scalar,Size,Size> > eigenSolver(_covar);
        _transform = eigenSolver.eigenvectors()*eigenSolver.eigenvalues().cwiseMax(0).cwiseSqrt().asDiagonal();

    }

    Matrix<Scalar,Size,-1> samples(int nn)
    {
    return (_transform * Matrix<Scalar,Size,-1>::NullaryExpr(Size,nn,randN)).colwise() + _mean;
    }
};

我打电话给pi2cma.cpp

void pi2cma::init(long init_exp){
(...)
sigma.setMean(MN); // error
set_MN(MN);        // works
    (...)
}

【问题讨论】:

  • 我的水晶球说错误在第 42 行。
  • 我说 pi2cma.cpp 的第 1 行丢失#include "sigma.h"
  • 显示代码的相关部分。

标签: c++ class compiler-errors


【解决方案1】:

在您的代码中,sigma 是一个函数:

Eigen::EigenMultivariateNormal<double,DIM> sigma(Eigen::VectorXd,Eigen::MatrixXd);

你不能在函数上调用成员函数。

【讨论】:

  • 我可以保证它不是函数。它是一个实现多元正态分布的类。
  • @joaocandre 这是您发布的代码中的函数声明。
  • 那么在pi2cma.hpp中没有正确声明。如何在不使用类构造函数的情况下将其声明为 EigenMultivariateNormal 类的对象?
  • @joaocandre 看看this
  • 问题是,sigma 不应该是全局变量,而是EigenMultivariateNormal 类的属性。不知何故,我设法通过为该类创建一个空的构造函数来避免编译器错误,然后可以在我的 pi2cma 类中简单地声明 Eigen::EigenMultivariateNormal&lt;double,DIM&gt; sigma;。但我不确定这是否是最好的方法,它似乎更像是解决我仍然不完全理解的问题的变通办法;
【解决方案2】:

在 pi2cma.cpp 中

#include "sigma.h" 

【讨论】:

  • sigma 不是类,是 eigen_multivariate_normal.hpp 文件中 EigenMultivariateNormal 类的对象,我将其包含在 pi2cma.cpp 文件中
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多