->のベースオペランドに、クラスの配列を作成するときに非ポインター型エラーがあります

Ken_sf

->ポインタと一緒に使用すると、ベースオペランドが機能する場合と機能しない場合がある理由を知りたいと思います。

このエラーが発生し.->ときに、の代わりにを使用する必要があることに気付きました。.ポインタを配列要素として参照するときに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;
}
セルゲイA

違いは非常に単純です。p[i]とまったく同じ*(p + i)です。i[p]配列サブスクリプションを作成する有効な(非常に紛らわしい)形式であるという点で、まったく同じです。

そのため、p[i]フォームを使用すると、すでに結果が逆参照されているため、.メンバーアクセスを介してメンバーにアクセスします。

(p + i)逆参照せずに使用し->ている場合は、ポインターを扱っているため、アクセス演算子を介してメンバーにアクセスする必要があります。

単なる再ハッシュ-->便利なショートカットにすぎません。あなたが何かを書くときはいつでもあなたはそれをいつでも書くことa->xができます(*a).x

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

「エラー:「->」の基本オペランドに非ポインタ型「***」があります」イテレータを使用して別のクラスからメソッドを呼び出すとエラーが発生します

分類Dev

「 '->'のベースオペランドに非ポインタ型 'JNIEnv'があります」をコンパイルしていないJNIIMUコード

分類Dev

エラー:「->」の基本オペランドに非ポインタ型「const」があります

分類Dev

shared_ptrのベクトルがエラーになります:ベクトルリストをプッシュバックしたいときに「オーバーロードされた関数のインスタンスがありません」

分類Dev

クラスのインスタンスを作成するときにエラーが発生しました

分類Dev

エラー: '->'のベースオペランドが非ポインタタイプ 'JNIEnv'です

分類Dev

基本クラスへのポインタがあるときにオブジェクトのクローンを作成しますか?

分類Dev

Codableクラスのインスタンスを作成するときに、呼び出しでパラメーター 'from'の引数がありません

分類Dev

水平スライドページは、次のボタンをクリックするときに位置を上に設定する必要があります

分類Dev

配列への C++ ポインターに関するエラー: 単項 * の無効な型引数 ('int を持っている)、割り当ての左側のオペランドとして左辺値が必要です

分類Dev

Amazon ec2インスタンスを作成すると、オペレーターエラーboto3に割り当てることができません

分類Dev

インスタンス作成をカウントするためにクラス変数とクラスメソッドを使用しているときにサポートされていないオペランドタイプエラー

分類Dev

任意の列挙型を取ることができるテンプレート(非型)パラメータークラスを作成できますか?C ++ 11

分類Dev

エラー:daskでカスタムクラスのコンストラクターにクライアントオブジェクトを渡すときに、モジュール名「カスタムクラス」がありません

分類Dev

eslintエラーを無視:「インポート」と「エクスポート」はトップレベルにのみ表示される場合があります

分類Dev

eslintエラーを無視:「インポート」と「エクスポート」はトップレベルにのみ表示される場合があります

分類Dev

Android-エラー:このフィールドをデータベースに保存する方法がわかりません。あなたはそれのために型コンバーターを追加することを検討できますか?

分類Dev

Javascript:IDが生成されたときに、ページ上のクラスの単一インスタンスを削除する必要があります

分類Dev

このデモでは、各列にインデックスを作成するか、1つの非クラスター化インデックスのみを作成する必要があります(インデックススキャン、シーク)

分類Dev

配列を渡してsvg.jsのポリライン配列メソッドにフィードするとエラーがスローされます

分類Dev

オンラインのプロジェクト管理データベースを作成するには、何を学ぶ必要がありますか?

分類Dev

クラスライブラリの列挙型をアプリケーションのラジオボタンにバインドする方法を理解する必要があります

分類Dev

GoogleApiClient:サービスがバックグラウンドにあるときにステータスバーのGPSアイコンを非表示にする

分類Dev

オブジェクトのインスタンスをベクターで検索するときにエラーが発生しました

分類Dev

ベースと派生の両方が派生型パラメーターでテンプレート化されている場合にベースコンストラクターを呼び出すときのコンパイラエラー

分類Dev

オペランドタイプの衝突:データベースを更新しようとすると、intが日付と互換性がありません

分類Dev

if/then ステートメントの使用に問題があります: `((: == : 構文エラー: オペランドが必要です (エラー トークンは "== ")`

分類Dev

サービスを作成するときに空のコンストラクターはありません

分類Dev

カットがスーパークラス上にあるときに派生クラスがオーバーライドするときに、ポイントカットを2回押すのを回避するにはどうすればよいですか?

Related 関連記事

  1. 1

    「エラー:「->」の基本オペランドに非ポインタ型「***」があります」イテレータを使用して別のクラスからメソッドを呼び出すとエラーが発生します

  2. 2

    「 '->'のベースオペランドに非ポインタ型 'JNIEnv'があります」をコンパイルしていないJNIIMUコード

  3. 3

    エラー:「->」の基本オペランドに非ポインタ型「const」があります

  4. 4

    shared_ptrのベクトルがエラーになります:ベクトルリストをプッシュバックしたいときに「オーバーロードされた関数のインスタンスがありません」

  5. 5

    クラスのインスタンスを作成するときにエラーが発生しました

  6. 6

    エラー: '->'のベースオペランドが非ポインタタイプ 'JNIEnv'です

  7. 7

    基本クラスへのポインタがあるときにオブジェクトのクローンを作成しますか?

  8. 8

    Codableクラスのインスタンスを作成するときに、呼び出しでパラメーター 'from'の引数がありません

  9. 9

    水平スライドページは、次のボタンをクリックするときに位置を上に設定する必要があります

  10. 10

    配列への C++ ポインターに関するエラー: 単項 * の無効な型引数 ('int を持っている)、割り当ての左側のオペランドとして左辺値が必要です

  11. 11

    Amazon ec2インスタンスを作成すると、オペレーターエラーboto3に割り当てることができません

  12. 12

    インスタンス作成をカウントするためにクラス変数とクラスメソッドを使用しているときにサポートされていないオペランドタイプエラー

  13. 13

    任意の列挙型を取ることができるテンプレート(非型)パラメータークラスを作成できますか?C ++ 11

  14. 14

    エラー:daskでカスタムクラスのコンストラクターにクライアントオブジェクトを渡すときに、モジュール名「カスタムクラス」がありません

  15. 15

    eslintエラーを無視:「インポート」と「エクスポート」はトップレベルにのみ表示される場合があります

  16. 16

    eslintエラーを無視:「インポート」と「エクスポート」はトップレベルにのみ表示される場合があります

  17. 17

    Android-エラー:このフィールドをデータベースに保存する方法がわかりません。あなたはそれのために型コンバーターを追加することを検討できますか?

  18. 18

    Javascript:IDが生成されたときに、ページ上のクラスの単一インスタンスを削除する必要があります

  19. 19

    このデモでは、各列にインデックスを作成するか、1つの非クラスター化インデックスのみを作成する必要があります(インデックススキャン、シーク)

  20. 20

    配列を渡してsvg.jsのポリライン配列メソッドにフィードするとエラーがスローされます

  21. 21

    オンラインのプロジェクト管理データベースを作成するには、何を学ぶ必要がありますか?

  22. 22

    クラスライブラリの列挙型をアプリケーションのラジオボタンにバインドする方法を理解する必要があります

  23. 23

    GoogleApiClient:サービスがバックグラウンドにあるときにステータスバーのGPSアイコンを非表示にする

  24. 24

    オブジェクトのインスタンスをベクターで検索するときにエラーが発生しました

  25. 25

    ベースと派生の両方が派生型パラメーターでテンプレート化されている場合にベースコンストラクターを呼び出すときのコンパイラエラー

  26. 26

    オペランドタイプの衝突:データベースを更新しようとすると、intが日付と互換性がありません

  27. 27

    if/then ステートメントの使用に問題があります: `((: == : 構文エラー: オペランドが必要です (エラー トークンは "== ")`

  28. 28

    サービスを作成するときに空のコンストラクターはありません

  29. 29

    カットがスーパークラス上にあるときに派生クラスがオーバーライドするときに、ポイントカットを2回押すのを回避するにはどうすればよいですか?

ホットタグ

アーカイブ