2016-07-02 7 views
0

プライベートクラスのデータはクラス内でしかアクセスできないことがわかっています。しかし、私が読んだ例では、プログラムコードで私的メンバーの同様の使用が示されています。私はプライベートクラスのメンバーにアクセスして操作するために関数を使用しようとしていますが、それは機能しません。私は間違って何をしていますか?私はData.SelectionF()の代わりにData.selectを最初のcinの後に、そしての選択のメンバー変数のすべてのインスタンスの代わりに使用してみました。私はまた、メンバ変数のすべてのインスタンスに対して同じアプローチを試みました。ありがとうC++プライベートクラスのデータをプログラム内で使用する

#include <iostream> 
    #include <iomanip> 

    using namespace std;  

    class allData { 

    private: 
     char selection; 
     double r; 
     double centimeter; 
     double value; 
    public: 
     double ConvertC (double value); 
     double ConvertR (double value); 
     double valueF (double value); 
     char selectionF (char selection); 
     allData Data(); 

    } Data; 

    int main() { 

    cout << "Enter C for converting your Feet to Centimeters.\n" 
      "Enter R for converting your Inches to Centimeters.\n"; 

    cin >> Data.selection; 

    cout << "\nYou selected to convert to: " << 
      Data.selectionF(Data.selection) << ".\n\n"; 

    cout << "Enter your starting value to two decimal places, and press 
      ENTER.\n\n"; 

    cin >> Data.value; 

    cout << "\nYou entered a starting value of: " << 
       Data.valueF(Data.value) << ".\n\n"; 

    //switch to decide which conversion function to use from the structure 

    switch (Data.selectionF(Data.selection)) { 

     case 'c': { Data.ConvertC(Data.value); 
      cout << "Your Feet converted to Centimeters is: " << 
      Data.ConvertC(Data.value) << "\n\n"; 
      break; 
        } 

     case 'C': { Data.ConvertC(Data.value); 
      cout << "Your Feet converted to Centimeters is: " << 
      Data.ConvertC(Data.value) << "\n\n"; 
      break; 
        } 
     case 'r': { Data.ConvertR(Data.value); 
      cout << "Your Inches converted to Centimeters is: " << 
      Data.ConvertR(Data.value) << "\n\n"; 
      break; 
        } 

     case 'R': { Data.ConvertR(Data.value); 
      cout << "Your Inches converted to Centimeters is: " << 
      Data.ConvertR(Data.value) << "\n\n"; 
      break; 
        } 
     default: {cout << "You entered an invalid selection for your conversion" 
      "choice.\n"; 
      break; 
       } 
     } 

    return 0; 

     } 

    //Function definitions 
    double allData::ConvertC (double value) { 
     centimeter = value * 30.48; 
     return centimeter; 
    } 

    double allData::ConvertR (double value) { 
     r = value * 2.54; 
     return r; 
    } 
    double allData::valueF (double value) { 
     return value; 
    } 

    char allData::selectionF (char selection) { 
     return selection; 
    } 

    //End of program. 
+0

例を誤解していると思います。 "ゲッターとセッターをC++で"読み込み、もう一度やり直してください。必要なパターンは 'cin >> localVarです。 classInstance.setProperty(localVar); ' –

+0

[namespace stdを使うのは悪い考えです](http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad-practice ) –

答えて

2

あなたが読んだ例は間違っているか、誤解しています。クラス外のプライベートクラスメンバーにアクセスすることはできません(friend宣言はもちろんありません)。それはプライベートクラスのメンバーが定義する意味です。

cin >> Data.selection; 

selectionはプライベートクラスのメンバーです。 main()からアクセスすることはできません。それは、ほとんど、それについて言えることです。

+0

私はこれまで試みたことはありませんが、これが同じ名前空間でmainを宣言するための有効な構文であるかどうか疑問です。 'int allData :: main(){' – ifma

+1

構文は有効です。ただし、アプリケーションの起動時に実行されるmain()関数ではありません。これは、まったく別のクラスメソッドであり、allData :: foo()、またはallData :: bar()と異なることはありません。 –

+0

この貴重な情報をありがとうございます。 – ifma

0

私があなたの質問を誤解しなかった場合は、あなたの問題について何か教えてください。 まず、この行「cin >> Data.value;」では、実際には「DATA」クラスのプライベート値を取得しようとしています。これは間違っています。 "DATA"クラスの外部からプライベート変数にアクセスすることはできません。オブジェクト "DATA"は、 "DATA"クラスの内部にありません。一方あなたは間接的にクラス内のプライベート変数にアクセスしたい場合は、あなたがそのような関数を書くことができます。

public: 
void function_name(const DATA &dataObject) const 
{ 
    cout << "The selection value : " << dataObject.selection << endl; 
} 

このコードの一部は、間接的にクラス内のプライベート変数にアクセスします。関数がクラスの中にある場合、すべてのプライベート変数にアクセスすることができ、このコードに何か問題はないことを覚えておいてください。

+0

...私が提供した変数の文脈の中で、私はこれをどのように書いていますか?私は成功しなかったことに似たものを試しました。 – cppstudent1

関連する問題