2017-02-07 3 views
-1

Я закончил курс начинающих по удемии, но я всегда стараюсь с пониманием указателей, я начал много раз, и указатели разбивали мое любопытство на программирование каждый раз. Теперь я, наконец, хочу пройти эту границу. Суть этого вопроса, в то время как инструктор создает указатель на объект, он выделил их, как описано здесь: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 *.

E2: да, в усовершенствованном C++ являются все эти структуры, векторы, списки, карты и многие C++ 11 функции, упомянутые

+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
  • Не забывайте подробно регулировать владение своим указателем. Соедините new с delete и new[] с delete[], иначе вы можете протечь ресурс.

  • Позвольте умному указателю помочь вам управлять владением указателем, отметьте std::unique_ptr или std::shared_ptr.

  • Использование const char* для хранения символьной строки и так же по типу параметра вместо char*.

  • Это k[i] возвращенный объект, а не указатель. k инициализируется как массив человека длиной 3. k[i] означает разыменовать элемент массива на i. Я думаю, инструктор потерял &, чтобы связать k[i] как person& a_person = k[i];

  • Попробуйте другой учебный ресурс.

+0

Первой точкой в ​​списке должно быть: не использовать (необработанные) указатели, если нет необходимости делать это. В примере OP нет необходимости в одном указателе – user463035818

+0

Я думаю, что OP все еще изучает указатель, поэтому я просто даю несколько советов при использовании необработанного указателя. –

+1

Да, я знаю, и первый совет должен не использовать их;). Серьезно, самое худшее, что я могу себе представить, - это код, полный новых и удаленных, когда никогда не было необходимости в указателе в первую очередь. – user463035818

0

В первом случае вы ¨R создание новых данных объектов и копирование из объекта в массиве , Таким образом, вы работаете с объектом «a_person», а не с объектом в массиве. Во втором случае вы работаете с объектами в массиве.

+0

Спасибо, поэтому, за исключением плохого кода, я мог бы понять это хорошо, как вы писали. Возможно, курс Advanced C++ будет объяснять другие возможности, как описано другими. –

 Смежные вопросы

  • Нет связанных вопросов^_^