C++ クラスと関数の扱い。public と private
今、練習中に気づきましたが
C++でarrayで安易にsizeofを使おうとすると大変なことになりますね。
int a[5]; for(int i = 0; i < sizeof(a);i++){ cout<<a[i]<<endl; }
とかやろうとすると、上手くいかないんですね。
こういうときは
sizeof(array) / sizeof(array[0])
を使うようですね。
実際
#include<iostream> #include<string> using namespace std; int main() { int a[5] = { 0,0,0,0,0 }; cout << sizeof(a) << endl; return 0; }
とすると
20らしいです。
sizeof(array) / sizeof(array[0])
を使うと
となっていい感じです。
これはもう定義しておきましょう。
#include<iostream> #include<string> #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) using namespace std; int main() { int a[5] = { 0,0,0,0,0 }; cout << ARRAY_LENGTH(a) << endl; return 0; }
クラスと関数
クラスの作り方ですが、すごく適当に言えばこんな感じ。
#include<iostream> #include<string> #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) #define NUM 5 using namespace std; class Stack{ public: int value = rand() % 100 + 1; }; int main() { Stack a; Stack b; return 0; }
{}を閉じるタイミングがすごく慣れないです。
これでStackクラスが出来ました。したのint main()の所でStackクラスの変数を2つ宣言しています。
このaとbはvalueの値を持っているので、ピリオドで繋ぐことで使うことが出来ます。出力してみると
#include<iostream> #include<string> #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) #define NUM 5 using namespace std; class Stack{ public: int value = rand() % 100 + 1; }; int main() { Stack a; Stack b; cout << "a=" << a.value << endl; cout << "b=" << b.value << endl; return 0; }
いい感じですね。
ここでpublicとprivateの差に入ります
publicとprivate
とりあえず、public→privateへ変換
#include<iostream> #include<string> #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) #define NUM 5 using namespace std; class Stack{ private: int value = rand() % 100 + 1; }; int main() { Stack a; Stack b; cout << "a=" << a.value << endl; cout << "b=" << b.value << endl; return 0; }
これで実行しようとするとビルドエラー
こんなエラーが出ています
エラー C2248 'Stack::value': private メンバー (クラス 'Stack' で宣言されている) にアクセスできません。
要は、privateにするとStackクラス内からしか操作できなくなります。もちろん出力だけも禁止です。今回エラーの原因は15,16行目ですね。
なので、出力する関数をStackクラス内に書きます。
class Stack{ private: int value = rand() % 100 + 1; public: int getvalue(); }; int Stack::getvalue() { return value; }
といって取得する関数でもいいですし
class Stack{ private: int value = rand() % 100 + 1; public: void getvalue(); }; void Stack::getvalue() { cout<<value<<endl; }
でもいいです。
ここで、クラス内でちゃんと返り値などの定義もしてあげないと動かないので(これが分かるのに時間かかった・・・)注意してください。
set等も同様に行うことで、関数を経由しないと数値が操作できなくなります。勝手に値を変えられないように制限するために使ったりするのかな?
#include<iostream> #include<string> #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) #define NUM 5 using namespace std; class Stack{ private: int value; public: int getvalue(); void setvalue(); }; int Stack::getvalue() { return value; } void Stack::setvalue() { cin >> value; } int main() { Stack a; Stack b; a.setvalue(); b.setvalue(); cout << "a=" << a.getvalue() << endl; cout << "b=" << b.getvalue() << endl; return 0; }