2017-02-07 26 views
-1

私はudemyで初心者コースを終了しましたが、私はいつもポインタを理解するのに苦労しています。今度はこの境界を通過したいと思っています。この質問のポイント、インストラクターがここで説明するように、彼はそれらを割り当てられたオブジェクトのポインタを作成している間:C++ /ベストプラクティスでポインタを操作する

person* k = new person[3] ; 

for (i=0;i<3;i++){ 
// Why did he create a new person and copy the object from a pointer? 
// isn't this wastage of space or has it a good reason. 
    person a_person = k[i] ; 
    char *name = "Superman" ; 
    a_person.set_name(name, strlen(name)) ; 
    a_person.set_age(30) ; 
    a_person.describe() ; 

// isn't this better? Directly using the pointer to access the memory 
// our pointer is pointing and change the variables there? 
    char *surname = "Spiderman" ; 
    (k+i)->set_name(surname, strlen(name)) ; 
    (k+i)->set_age(10) ; 
    (k+i)->describe(); 

} 

class person { 

public: 
    person(); 
    ~person(); 
    int length() ; 
    void get_addresses(); 
    int getid() ; 
    void set_name(char *ptr_name, size_t bytes) ; 
    char* get_name() ; 
    int get_age() ; 
    void describe() ; 
    void set_age(int number) ; 

private: 
    char* name ; 
    int age ; 
    int id ; 
    size_t bytes = 30 ; 
    int get_unique() ; 
    int setid() ; 
}; 

E:コースは他のコードがあったが、どういうわけか私はそれを試してみて、私はこれを建てましたいくつかの関数とchar *を持つPersonクラスです。

E2:はい、高度なC内のすべてのこれらの構造、ベクトル、リスト、マップおよび多くのC++ 11の機能を使用すると、配列内のオブジェクトから新しいオブジェクトとコピーデータを作成するrの最初のケースでは

+2

[C++およびリソース所有ポインタのためのベストプラクティス](https://dl.dropboxusercontent.com/u/6101039/Modern%20C%2B%2B.pdf)。 – WhozCraig

+6

これはCとC++の両方にとってひどいコードです。あなたが持っているインストラクターが何であれ、今すぐ辞めて、彼らが何度も何度も言うことを聞くことはありません。その後、[書籍を読む](http://stackoverflow.com/a/388282/3484570)。 – nwp

+0

学習例:http://stackoverflow.com/questions/41930685/passing-pointer-from-function-to-function/41930944#41930944 – sameerkn

答えて

0
  • ポインタの所有権を慎重に管理することを忘れないでください。 newdeleteに、new[]delete[]とペアにすると、リソースがリークする可能性があります。

  • スマートポインタを使用してポインタの所有権を管理する場合は、std::unique_ptrまたはstd::shared_ptrをチェックしてください。

  • 使用const char*文字列リテラルを保持するので、パラメータの型の代わりchar*でいます。

  • 返されるk[i]は、ポインタではなくオブジェクトです。 kは、長さ3の人物の配列として初期化されます。k[i]は、配列の要素をiの位置に逆参照することを意味します。私はインストラクターがを縛るために&を失ったと思います。person& a_person = k[i];

  • 他の学習リソースを試してみてください。

+0

リストの最初のポイントは次のようにする必要があります。 OPの例では、単一のポインタの必要はありません – user463035818

+0

私はOPはまだポインタを学習していると思うので、私は生のポインタを使用するときにいくつかのヒントを与えます。 –

+1

はい私は知っている、そして最初のヒントはそれらを使用するべきではありません;)。真剣に最悪のことは私が想像することができる新しいコードの完全な最初の場所にポインタの必要性がなかったときに削除します – user463035818

0

を述べている++ 。このようにして、あなたは配列のオブジェクトではなく、 'a_person'オブジェクトで作業します。後者の場合、配列内のオブジェクトを使用して作業しています。

+0

ありがとうございます。あなたが書いたように、貧弱なコードを除いて、私はそれをよく理解するかもしれません。たぶんAdvanced C++コースでは、他の人が説明したような他の可能性について説明します。 –

関連する問題