->
ポインタと一緒に使用すると、ベースオペランドが機能する場合と機能しない場合がある理由を知りたいと思います。
このエラーが発生し.
た->
ときに、の代わりにを使用する必要があることに気付きました。.
ポインタを配列要素として参照するときにaが必要な理由p[i].somefunct()
と->
、ポインタを直接として参照するときに必要な理由を理解しようとしています(p+i)->somefunct()
。
私は両方の方法を説明するためにサンプルプログラムを作成しましたが、経験豊富な声でこのC ++の動作を説明できるかどうか疑問に思います。
また、ヒープに格納されているクラスへのポインターの配列を作成、アクセス、および破棄するためのより良い方法があるかどうかを学ぶことに興味があります。
#include <iostream>
using namespace std;
class KClass {
public:
int x;
KClass(){};
~KClass(){};
int getx(){ return x; }
void setx(int data){ x = data; return; }
};
int main()
{
//use the heap to create an array of classes
KClass *pk = new KClass[3]; //array of 3 pointers
KClass *pk1 = new KClass[3]; //array of 3 pointers
//do something
for (int i = 0; i < 3; i++){
(pk+i)->setx(i);
cout << "(pk+" << i << ")->getx(): " << (pk+i)->getx() << endl;
}
cout << endl;
for (int i=0;i<3;i++){
//does not compile: pk1[i]->setx(i);
//why is different syntax required when I access pk1 as an element of an array?
pk1[i].setx(i);
cout << "pk1[" << i << "].getx(): " << pk1[i].getx() << endl;
}
delete [] pk;
delete [] pk1;
pk = nullptr;
pk1 = nullptr;
getchar();
return 0;
}
違いは非常に単純です。p[i]
とまったく同じ*(p + i)
です。i[p]
配列サブスクリプションを作成する有効な(非常に紛らわしい)形式であるという点で、まったく同じです。
そのため、p[i]
フォームを使用すると、すでに結果が逆参照されているため、.
メンバーアクセスを介してメンバーにアクセスします。
(p + i)
逆参照せずに使用し->
ている場合は、ポインターを扱っているため、アクセス演算子を介してメンバーにアクセスする必要があります。
単なる再ハッシュ-->
便利なショートカットにすぎません。あなたが何かを書くときはいつでもあなたはそれをいつでも書くことa->x
ができます(*a).x
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加