2014-10-26 72 views
0

我正在編碼一個謎機器,並有問題爲我的機器類構造函數。儘管實際上必須在構造函數的參數中提供插件板,但是看起來插件板的構造函數正在被調用。以下是錯誤在構造函數C++中奇怪的函數調用

Machine.cpp: In constructor ‘Machine::Machine(std::list<Rotor>, Plugboard)’: 
Machine.cpp:6:48: error: no matching function for call to ‘Plugboard::Plugboard()’ 
Machine::Machine(list<Rotor> rots, Plugboard pb) { 

Machine.cpp:

#include "Machine.h" 

using namespace std; 


Machine::Machine(list<Rotor> rots, Plugboard pb) { 

    plugboard = pb; 
    rotors = rots; 

} 

//give c's alphabet index 
int Machine::getPosition(char c) { 
    if (c >= 'A' && c <= 'Z') { 
    return c - 'A'; 
    } 
    else { 
    cout << "not an accepted character"; 
    return -1; 
    } 
} 

//give letter at index i in alphabet 
char Machine::atPosition(int i) { 
    assert(i>=0 && i<=25); 
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i]; 
} 

char Machine::encode(char c) { 
    assert(c >= 'A' && c <= 'Z'); 
    //plugboard 
    c = plugboard.getMatch(c); 
    //forward pass through rotors 
    c = rotors[0].process(c); 
    //reflector 
    c = Reflector::reflect(c); 
    //backwards pass through rotors 
    c = rotors[0].processInverse(c); 
    return c; 

} 

Machine.h:

#ifndef MACHINE_H 
#define MACHINE_H 

#include <stdexcept> 
#include <iostream> 
#include <assert.h> 
#include <list> 
#include "Reflector.h" 
#include "Rotor.h" 
#include "Plugboard.h" 

class Machine{ 

    public: 

    Machine(std::list<Rotor> rots, Plugboard pb); 
    static int getPosition(char c); 
    static char atPosition(int i); 
    char encode(char c); 

    private: 

    std::list<Rotor> rotors; 
    Plugboard plugboard; 

}; 

#endif 
+0

複製轉子列表兩次。爲什麼? – 2014-10-26 13:47:03

+0

我不知道你指的是 – 2014-10-26 13:49:05

+0

您的構造函數按值傳遞列表,這會導致副本。然後它將副本複製到成員變量中。爲什麼不通過const引用並防止複製? – 2014-10-26 15:59:38

回答

5

這是因爲在構造函數,你是第一個默認構造plugboard,然後複製分配它。只需在初始化列表中構造它。並採取由const &

Machine(const std::list<Rotor>& rots, const Plugboard& pb) 
: rotors(rots) 
, plugboard(pb) 
{ } 
+0

感謝您的回答。 Id之前看到了這個初始化器列表語法,但假定它等同於我使用的java樣式assignmnent。你能解釋一下const和?的用法嗎? – 2014-10-26 13:46:55

+0

@AdrianRothan避免複製。如果您按值傳入您的列表,它將被複制兩次 - 一次進入構造函數,然後一次進入「轉子」。這樣,你只能得到一個副本。 – Barry 2014-10-26 13:51:29