Списки и указатели C++

Я работаю над домашним заданием и хотел знать, что это на самом деле определяется как:

list < NAME > * m_ofList

Где имя происходит от struct вот так:

typedef struct name
{
    int age;
    int height;
} NAME;

Я хочу знать, что это такое, чтобы знать, как вставить в него или получить к нему доступ: push_back, insert, и т. д..

Итак, теперь я это понимаю, но я застрял из-за какого-то доступа к памяти: он вызывает ошибку сегментации, и я не смог понять это. Где мне нужно инициализировать мой новый список? он не работает в конструкторе или в функциях. Просто к вашему сведению, это частный список, поэтому его можно использовать только для функций-членов (например, m_ofList). Я могу создать код, если кто-то хочет помочь...


person guy_without_a_name    schedule 03.06.2012    source источник
comment
Пожалуйста, скажите нам, что list < NAME > * m_ofList и struct не принадлежат человеку, обучающему вас C++?   -  person Johnsyweb    schedule 03.06.2012
comment
И почему typedef struct для С++?   -  person UltraInstinct    schedule 03.06.2012
comment
это не пришло от меня, поэтому я не думаю, что смогу это изменить...   -  person guy_without_a_name    schedule 03.06.2012


Ответы (4)


Предполагая, что using namespace std или using std::list, это указатель на список объектов класса/структуры NAME. Чтобы поместить в него объекты, сначала нужно его инициализировать:

m_ofList = new list<NAME>;

or:

m_ofList = &(some already initialized list of NAME objects);

Затем вы можете поместить в него предметы:

NAME x;
x.age = 15;
x.height = 150;
m_ofList->push_back(x);
m_ofList->insert(m_ofList->begin(), x);

Если вы использовали динамическое выделение списка с помощью new, его необходимо правильно удалить, когда вы закончите с ним:

delete m_ofList;

Мой вопрос к вам: почему это указатель? Вы можете просто объявить это (как и следует) следующим образом:

list<Name> m_ofList;

Тогда вам не придется беспокоиться об утилизации. Об этом позаботятся правила области видимости.

person Benjamin Lindley    schedule 03.06.2012
comment
это помогает, однако, я получаю EXC_BAD_ACCESS, когда я его инициализирую (используя Xcode) или ошибку сегмента 11 с unix... не могли бы вы это объяснить? - person guy_without_a_name; 03.06.2012
comment
@BrianKnowlton: мне нужно увидеть более полный пример. Желательно полностью укомплектованный. - person Benjamin Lindley; 03.06.2012
comment
Вы получаете segfaults, когда пытаетесь получить доступ к недопустимым ячейкам памяти. Можете ли вы использовать отладчик и показать нам свою обратную трассировку? - person UltraInstinct; 03.06.2012
comment
Программа получила сигнал EXC_BAD_ACCESS, не удалось получить доступ к памяти. Причина: 13 по адресу: 0x0000000000000000 0x0000000100001f5b в CGraph::AddEdge() - person guy_without_a_name; 03.06.2012
comment
@BrianKnowlton: Когда я сказал полный пример, я имел в виду ваш код, а не сообщение об ошибке, извините за путаницу. - person Benjamin Lindley; 03.06.2012
comment
Да, я знаю, я хотел бы дать вам полный код, но я хотел бы быть честным с моим домашним заданием и не получать слишком много помощи. Я благодарю вас за то, что уже предоставили мне столько информации. - person guy_without_a_name; 03.06.2012
comment
@BenjaminLindley, я вроде как обошёл это (надеюсь, я смогу это хорошо объяснить). Он был объявлен в заголовочном файле, поэтому я просто переобъявил его в своем методе cpp и инициализировал его (в том же месте), и теперь он работает. Спасибо еще раз за помощь! - person guy_without_a_name; 03.06.2012
comment
Где инициализировать список? Похоже, не работает в конструкторе или его функциях-членах. - person guy_without_a_name; 05.06.2012

Независимо от типа данных, который вы выбрали для сохранения в своем списке, функции-члены останутся прежними.
Документацию о том, какие функции-члены вы можете вызывать для контейнера списка STL, можно найти здесь.
Вы можете создавать списки, содержащие данные любого типа, поскольку они строятся с помощью конструкции, известной как шаблоны. Шаблоны позволяют создавать списки различных типов данных.
Пример:

#include <list>
#include <string>
#include <cstdlib>


int main(){

    //here is a list that can only hold integers
    std::list<int> list1{1,2,3,4,5};

    //here is a list that can only hold characters
    std::list<char> list2{'a','b','c','d','e'};

    //we can create a new type to represent a person
    struct person{
        std::string name;
        int age;
        int height;

        person(std::string const& name_, int const& age_, int const& height_):
        name(name_), age(age_) ,height(height_){}
    };

    //and now that we have a new person type, we can create a list to hold people
    std::list<person> list3{{"John",21,70},{"Jane",20,68}};

    return EXIT_SUCCESS;
}

скомпилировано с помощью g++ -std=c++0x -o main main.cpp

person Trevor Hickey    schedule 03.06.2012

В C++ это, скорее всего, список STL. Вы можете найти некоторую документацию здесь: http://www.sgi.com/tech/stl/List.html

person user1431841    schedule 03.06.2012

Это STL list, который представляет собой связанный список переменных, структур или объектов. Он поддерживает операции «Вставка и удаление» в любой позиции. В list < NAME > * m_ofList m_oflist находится указатель на список объектов Name. Вот хороший учебник по списку STL.

person Eight    schedule 03.06.2012