2017-03-06 109 views
1

我有一個類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 
+4

「Calorimeter」類是否應該有一個'dumpReadoutMap'成員?或者它只是「CaloReader」類的成員?如果你想像'(r.calo())。dumpReadoutMap()'這樣的表達式,可能會更容易理解爲什麼會出現錯誤。即''r.calo()'***返回***時調用'dumpReadoutMap'。 –

+1

創建[mcve]。 – user2079303

+0

後一個。 –

回答

1

dumpReadoutMapCaloReader類的方法。所以它必須從CaloReader對象中調用。你應該使用:

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

這樣做會在嘗試訪問其中一個單元格時出現分段錯誤。 –

+0

@RobSchneider:這意味着你已經步入下一個問題:-)。更嚴重的是,現在編譯時,調試器可以幫助控制'dumpReadoutMap'中的值。但不應該是**'_calo->'**'grid()。cell(x,y) - > getID();'? –

+0

但是,由於函數無法訪問'grid()',因此它嘗試訪問某些不存在的事件,而不是由於這種事實導致的段錯誤? –

0

由於calo()返回一個const引用,所以你不能用它調用非const成員函數。錯誤信息不能清楚地解釋錯誤是什麼,這是令人失望的。

+0

刪除'const'部分仍然給出相同的錯誤。 –

+0

下面是一些基於編譯問題的代碼。編碼器的全部意圖對我而言並不清楚,因此可能沒有幫助。 https://godbolt.org/g/Bzimb3 – WaltK