- 締切済み
フルポインタ仕様にしたい。
プロローグ ポインタはデータがメモリさせれいるアドレスを扱うので、引数では関数を呼び出すたびにデータ本体をコピーせずにすみます。 だから、限られた資源の中比較的高速のプログラムができる… でも、ポインタはスペースシャトルの機内からロボットアームで小さな作業を行う感覚で、結構厄介な存在でもあります。 でも、ポインタを気持ちよく操れないとゲームなど高速なプログラムはできません。 そこで、データのやり取りはアドレスのみというルールで、簡単なプログラム書いてみましたが、コンパイルしてくれるものの、エラーが発生して動いてくれません。どこがおかしいのでしょうかご教授おねがいします。もし、「ポインタのみで作るのは無理があるでしょう?」と思う場合は「そりゃむでっせ」とか書いてください。 #include <iostream> using namespace std; class Bass{ private: int* m_piData; // ポインタ変数(int) double* m_pdData; // ポインタ変数(double) public: void SetData(int* piData, double* pdData); void DataShow(int* piData, double* pdData); int iGatData(){return *m_piData;} double dGatData(){return *m_pdData;} }; void Bass::SetData(int* piData, double* pdData) { *m_piData = *piData; *m_pdData = *pdData; } void Bass::DataShow(int* piData, double* pdData) { cout << *piData << 'と' << *pdData << '\n'; } int main() { int iTestData=1234; // int型データ(表示用) double dTestData=20.5; // double型データ(表示用) int* piTestData; double* pdTestData; Bass* c_pBass; // private変数データ書込み・ポインタ c_pBass->SetData(&iTestData, &dTestData); // インライン関数(private変数関数)・ポインタ *piTestData = c_pBass->iGatData(); // int型 *pdTestData = c_pBass->dGatData(); // double型 // private変数参照 c_pBass->DataShow(piTestData, pdTestData); return 0; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
既に書かれていますが… ポインタはなにか(どこか)を指し示すものです。 ポインタ変数を定義したからと言って指し示す先が虚空から生まれるわけではありません。 動的にメモリを確保するとか、変数を挿すようにする等の作業が必要です。
- ddnp009
- ベストアンサー率25% (15/58)
パフォーマンスを上げるために引数をポインタ渡しにする・・・ 間違いではないけれども、下に示すキーワードでお勉強なさってください。 『const』『reference』『const reference』 > Bass* c_pBass; > > // private変数データ書込み・ポインタ > c_pBass->SetData(&iTestData, &dTestData); Baseクラスの実体が無いので使えません。 「そりゃむでっせ」
- yaemon_2006
- ベストアンサー率22% (50/220)
> エラーが発生して動いてくれません。 どんなエラーでしょうか。 > class Bass{ > private: > int* m_piData; // ポインタ変数(int) > double* m_pdData; // ポインタ変数(double) > ・・・ ポインタが参照すべき値を入れる領域がないのでは。
補足
「Just-In-Time デバッグ」というウインドがあらわれ「いいえ」を選択すると、 おなじみの真っ黒画面に ハンドルされていない例外:System.NullReferenceException:オブジェクト参照がオブジェクト インスタンスに設定されていません。 at Bass.SetData(Bass* , Int32* piData, Double* pdData) in d:\ディレクトリ名\ファイル名.cpp:line 21 at main() in d:\ディレクトリ名\ファイル名.cpp:line 39 Press any key continue 以上が表示されていました。
- namacya
- ベストアンサー率8% (21/243)
// private変数データ書込み・ポインタ c_pBass->SetData(&iTestData, &dTestData); この時 c_pBassの値は不定であるため。。。
お礼
はい!お勉強します! お勉強のポイントを教えてくださってありがとうございます。