2016-06-23 20 views
0

すべて - 私はこれをかなり研究しました。私のプログラムはエラーなくコンパイルされますが、構造体内の関数の値はプログラムに渡されません。彼らがなぜそうでないのか理解してもらえますか?問題のコンポーネントを示すコードスニペットを含めました。主に、 "& allData :: ConvertToC"のようなコードは、構造体 "allData"内の関数から値を返していません。 "allData.temperature"の入力に関係なく、値は1だけ戻されます。私はプログラムのすべてのコンポーネントを知っている、言及されているもの以外は動作しています。構造体内の関数と参照によって呼び出す値

コードスニペット:

//defining the struct 

struct allData { 
    char selection; 
    double centigrade; 
    double fahrenheit; 
    double temperature; 
    double ConvertToC (const double& temperature); 
    double ConvertToF (const double& temperature); 
} allData; 

//adding data to the struct for the functions within the struct to use 

cout << "Enter C for converting your temperature to Celsius, or enter F for converting your temperature to Fahrenheit, and press ENTER." << endl << endl; 

cin >> allData.selection; 

cout << "Enter your starting temperature to two decimal places, and press ENTER." << endl << endl; 

cin >> allData.temperature; 

switch (allData.selection) { 

//my attempt to reference the functions within the struct and the data in the struct, but it is not working and always returns a value of 1. 

case 'c': { &allData::ConvertToC; 

    cout << "Your temperature converted to Celsius is: " << &allData::ConvertToC 
    << endl << endl; 
    break; 
    } 

case 'C': { &allData::ConvertToC; 

    cout << "Your temperature converted to Celsius is: " << &allData::ConvertToC  
    << endl << endl; 
    } 
} 


//Function definitions that are located in the struct. Do I define the functions in the normal way, like this, if they are located in the struct? 

double allData::ConvertToF (const double& temperature) { 

    double fahrenheit = 0; 
    fahrenheit = temperature * 9/5 + 32; 
    return fahrenheit; 

} 


double allData::ConvertToC (const double& temperature) { 

    double centigrade = 0; 
    centigrade = (temperature - 32) * 5 /9; 
    return centigrade; 

} 
+3

'&allData :: ConvertToC'はメソッドのアドレスであり、あなたはそれを呼び出さないので、' allData.ConvertToC(allData.temperature) 'を行う必要があります。 – Holt

+0

これも正しい答えです、私は信じています!ありがとうございました! – cppstudent1

答えて

1

あなたは、あなただけのcoutのストリームへの関数ポインタを渡している、関数呼び出しを実行していません。

私はあなたが本当にしたいことのようなものだと思う:あなたは本当に何(「二重を保存していないとして、あなたは「ConvertToC」の方法で参照渡しする必要はありません。また

cout << "Your temperature converted to Celsius is: " << allData.ConvertToC(allData.temperature) << endl; 

"は8バイト幅であり、参照/ポインタは32ビットシステムでは4バイト、64ビットシステムでは8バイト)。

+2

注:ストリームを不必要にフラッシュするので、 'endl'を繰り返して呼び出すのは悪い習慣です。代わりにストリームに '\ n'sを追加し、本当に必要な場合は最後にそれをフラッシュしてください。 – Andrew

+0

実際、それは行の残りの部分をチェックせずにコピーし貼り付けするのは私自身の責任です!私は今編集します。 – Fallso

+0

ありがとうございます - 私はendlの代わりに\ nを使用します。しかし、私は以下の編集を無駄にしました。私は '&allData :: ConvertToC'を 'allData :: ConvertToC(allData.temperature)'に変換しました。私は今コンパイラエラーを受け取ります: "オブジェクトを持たないでメンバー関数 'double allData :: ConvertToC(double)'を呼び出すことはできません case 'c':{allData :: ConvertToC(allData.temperature)" – cppstudent1

0
// Name of struct made distinct from its instance, for clarity. 
struct AllData { 
    char selection; 
    double centigrade; 
    double fahrenheit; 
    double temperature; 
    double ConvertToC(); 
    double ConvertToF(); 
} allData; 

... 

allData.selection = 'C'; 
allData.temperature = 74.5; 

switch (allData.selection) 
{ 
case 'c': 
case 'C': 
    cout << "Your temperature converted to Celsius is: " << allData.ConvertToC() << endl << endl; 
    break; 
} 

... 

double AllData::ConvertToF() 
{ 
    //double fahrenheit = 0; Why not store the result in the struct? 
    fahrenheit = temperature * 9/5 + 32; 
    return fahrenheit; 
} 

double AllData::ConvertToC() 
{ 
    //double centigrade = 0; 
    centigrade = (temperature - 32) * 5/9; 
    return centigrade; 
} 
+0

これも正しく動作しました。以前の関数定義には冗長性があり、それも同様に指摘しました。ありがとうございました! – cppstudent1

関連する問題