2010-11-24 13 views
1

私はオブジェクトCar car1としてインスタンス化されているclass Carというクラスを持っています。車のメンバ変数の一つがCar::widthですが、私はmain()からラインなぜ私のオブジェクトはそれ自身のプライベートメンバー変数にアクセスできませんか? [C++]

cout << car1.width << endl; 

を実行しようとしたとき、私はCar::widthがプライベートであるため、これが不可能であることを告げています。プライベートメンバーには、自分が所属するクラスのオブジェクトによってアクセスできるということが私の理解であったが、この状況では私は完全に困惑してしまった。プライベートメンバーが自分のオブジェクトでアクセスしているのはどうですか?

+0

この機能はどのような機能ですか?それはアクセスが「オブジェクトによって」であるかどうかに違いがあります。 – aschepler

+1

main()が 'Car'の関数の名前でない限り、なぜwidth変数にアクセスしようとしたのかが "... privateメンバーにはクラスのオブジェクトからアクセスできます彼らが属している。 –

答えて

4

プライベートメンバーは、それらが属する同クラスのメソッドでアクセスできます。

+0

IMHO、*メソッド*はあまりにもあいまいです。通常、「メソッド」は、オブジェクトに送られた「メッセージ」に対するオブジェクトの応答です。 Cでは、オブジェクトを表す構造体上で動作する関数を使って "メソッド"を実装します。 C++では、メッセージ "<<"をメンバ関数または非メンバ関数で実装できるように演算子をオーバーライドできます。したがって、そのメッセージの「方法」と考えることができます。メンバーの機能や友人だけが、メソッドが持つアクセス権を持っています。あなたの答えはあいまいで、おそらくは間違っていると思います。 –

+1

"メソッド"は、 "メンバ関数"の通常のC++用語です。C++のfaqでさえこれを大きく使います。例:http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.7 – zvrba

1

Carは、widthにアクセスできます。しかし、あなたの例ではにアクセスしています。widthにアクセスしようとしています。これはまさにprivateの意味です。

0

ここにあるように、メンバー関数内からアクセスすることはできますが、外部にアクセスすることはできません。プライベート変数の全体的なポイントは、あなたがしようとしていることを正確に防ぐことです。つまり、クラスのユーザがメンバ変数を使用できないようにすることです。

0

クラスのメソッドはwidthのメンバーにアクセスできますが、コード(coutを実行するコード)はアクセスできません。アクセス機能(この場合はmain)がメンバーやクラスCarfriendされていない場合

1

は、コンパイラはprivateメンバーwidthは、この文脈では立ち入り禁止であることを言って正しいです。

Carを作成できる人がprivateのメンバーにアクセスできる場合、プライバシーはそれほど意味はありません。コンストラクターpublicを作成してオブジェクトの作成を許可しますが、作成されたオブジェクトのデータメンバーをそのようなユーザーから非表示にして適切にカプセル化します。クラスのprivate内部の操作を、クラスのpublicまたはprotectedメンバーの法的な使用によって許可されているものに制限します。

-1
cout << car1.width 

これはwidthに取得しようとしてcar1ではありません - それはwidthに取得しようとcoutです。 coutcar1のメンバーではないため、widthはプライベートであるため、失敗します。

+1

誤解を招く。 'cout'はそれとは関係ありません。現在の関数定義のみが重要です。 'Car :: print()'に現れている場合、この同じステートメントは有効です。 – aschepler

+0

@aschelper:おそらく、あなたは 'main()'から実行しているこのコードに関する部分を見逃していましたか? –

+2

それについてifs、あなたは間違っています。あなたの答えは、「幅を出そうとしているのです」と言っています。それはまったく間違っています。たぶんそれはあなたが意味するものではありませんが、あなたが言ったことです。 ascheplerはあなたを訂正するのに正しいです。 –

関連する問題