参考指针调用成员函数

时间:2017-03-06 13:04:45

标签: c++ class pointers accessor

我有一个类CaloReader,它为名为_calo的对象创建一个指针Calorimeter,该对象包含一个带有ID号的单元格网格。然后,该指针用于为每个单元设置ID号。此外,我有一个访问器const Calorimeter& calo(),它返回此指针的引用。现在,我想创建一个函数dumpReadoutMap(),打印出所有单元格的所有ID号。该函数从我的主文件中调用,如下所示:

#include <iostream>
#include "CaloCell.hh"
#include "CaloGrid.hh"
#include "Point.hh"
#include "Calorimeter.hh"
#include "CaloReader.hh"

int main(){

    CaloReader r("calo.dat");
    r.calo().dumpReadoutMap();

}

我的代码存在的问题是complirer会出现以下错误:

error: ‘const class Calorimeter’ has no member named ‘dumpReadoutMap’
 r.calo().dumpReadoutMap();

此问题的唯一相关文件如下,因为其他文件是正确的,无法更改。

#ifndef CALOREADER_HH
#define CALOREADER_HH

#include <iostream>
#include <fstream>
#include "Calorimeter.hh"

#include "CaloReaderException.hh"
#include <string>
#include <iomanip>

class CaloReader {

public:

    CaloReader(const char* file): _file(file) {

        Calorimeter* _calo = 0;
        ifstream _file(file);

        std::string word;
        _file >> word;

        _file >> word; //Reads in next word.
        if(word=="SIZE") {
            int size_x;
            int size_y;
            _file >> size_x;
            _file >> size_y;

            _calo = new Calorimeter(size_x,size_y);

        }
        _file >> word;

        while(word=="POSITION") {
            int readoutID;
            int ix;
            int iy;
            _file >> readoutID >> ix >> iy;
            //std::cout << word << " " << readoutID << " " << ix << " " << iy << std::endl;
            _calo->grid().cell(ix,iy)->setID(readoutID);

            _file >> word;
        }
    }

    ~CaloReader() {}

    const Calorimeter& calo() const {
        return *_calo;
    }

    void dumpReadoutMap(std::ostream& os = std::cout) {


        for(int x =0; x<size_x; x++) {
            for(int y=0; y<size_y; y++) {
                os << std::setw(6) << grid().cell(x,y)->getID();
            }
            os << std::endl;
        }
    }


private:

    Calorimeter* _calo;
    std::ifstream _file;
    std::string word;

};
#endif

2 个答案:

答案 0 :(得分:1)

org.elasticsearch.index.mapper.MapperParsingException: failed to parse [timestamp] Caused by: java.lang.IllegalArgumentException: Invalid format: "2017-03-05T12:36:33.606" is malformed at "12:36:33.606" at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187) ~[joda-time-2.9.5.jar:2.9.5] dumpReadoutMap类中的方法。所以必须从CaloReader对象调用它。你应该使用:

CaloReader

答案 1 :(得分:0)

由于calo()返回一个const引用,因此无法使用它调用非const成员函数。令人失望的是错误消息没有清楚地解释错误是什么。