2

我没有真正得到模板 std::vector 的字段,第一个指定类型,例如一个类,但我没有得到分配器、指针和引用变量。

我将提供一个简单的示例,我想使用类 person 的向量,所以我必须对模板向量说:嘿,存储一些person的,但我还必须告诉向量如何分配该类。(1) 该示例的正确语法如何?

一些代码开始:

旁注,在的构造函数中,c(2)我应该使用日期*吗?

class date
{
public:
    int m_nMonth;
    int m_nDay; 
    int m_nYear;

    int getMonth(return m_nMonth;)
    int getDay(return m_nDay;)
    int getYear(return m_nYear;)

    void setDate(int month, int day, int year)
    {
            m_nMonth=month;
            m_nDay=day;
        m_nYear=year;
    }

    date()
    {
        setDate(0,0,0);
    }

    date(int month, int day, int year)
    {
        setDate(month,day,year);
    }

    void printDate()
    {
        printf("%d/%d/%d", m_nMonth, m_nDay, m_nYear);
    }
}

class person
{
public:
    int m_nID;
    char m_sName[128];
    char m_sSurname[128];
    date m_cBirthDay;

    void setName(const char* name)
    {
        strncpy(m_sName, name, 127);
        m_sName[127]= '\0';
    }

    void setSurname(const char* surname)
    {
        strncpy(m_sSurname, surname, 127);
        m_sName[127]= '\0';
    }

    void setBirthDay(date* bday);
    {
        m_cBirthDay.date(bday.getMonth(), bday.getDay(), bday.getYear)
    }

    person(int id, const char* name, const char* surname, date bday)/*should it be date* bday? why?*/
    {
        m_nID=id;
        setName(name);
        setSurname(surname);
        setBirthDay(bday);
    }

}

我想您必须在类人中声明一个函数,称为分配器,这是您调用时作为第二个参数传递的内容,(3)如何定义分配器函数?:

vector <person*, /*some allocator call*/> ImAVector;

然后,(4)我怎么能在向量中推一些东西,(5)这行得通吗?:

person* someperson;
someperson.person(/*arguments*/);
ImAVector.push_back(someperson);

(6) 如何检索指向特定实例的指针?(7) 我可以使用迭代器来做这样的事情吗?:

//(6)
person* = ImAVector[someIterator];
//and then (7)
ImAVector[someIterator].setName(someConstCharPointer);
string* something = person.getName();

另外,(8)分配器与构造函数有什么关系吗?(9)分配类实例后立即填写类字段的常用程序?(10) 分配器可以调用构造器吗?

最后一个问题: (11) 什么是引用字段、指针字段和它们的 const 对应项?

我知道要写很多东西,但是我在过去的两天里一直在寻找示例,但没有成功,所以如果有人对这个很少讨论的话题有所了解,我会很好地列出所有问题以便于回答。

我很感激任何答案:)

4

2 回答 2

6

该示例的正确语法如何?

除非您有充分的理由存储指针,否则不要。然后你只需声明

std::vector<person> people;

// In C++11, you can create people in place
people.emplace_back(id, name, surname, birthday);

// Historically, you had to create a person and copy it in
people.push_back(person(id, name, surname, birthday));

并且所有分配都是为您管理的。

需要指针的原因包括:

  • 向量不应该管理对象。在这种情况下,您不需要告诉向量如何分配它们。
  • 也许person是一个基类,你想存储各种不同的子类型。

在这种情况下,我认为您无法使用分配器来提供帮助。相反,您可以存储智能指针以在从容器中删除指针时自动删除对象:

std::vector<std::unique_ptr<person>> people;
people.push_back(std::unique_ptr<person>(new person(id, name, surname, birthday)));

另一种方法是处理原始指针并尝试在正确的时间删除对象;但是生命太短暂了,不能胡说八道。

(2) 我应该使用date*吗?

const不。对于大型或复杂的类,传递参考可能是有益的, const date&; 但是这个类很简单,可以按值传递。传递指针会很奇怪,除非在像 C 这样的语言中,这是通过引用传递的唯一方法。

我如何检索指向特定实例的指针?

people[index]为具有该索引的人提供参考(而不是指针)。如果您出于某种原因确实需要指针,请使用&获取地址:

person & ref = people[index];
person * ptr = &ref;

我可以使用迭代器来做这样的事情吗?

不,[]用于通过数组索引访问,而不是取消引用迭代器。如果你有一个迭代器it,那么*it给你一个对象的引用。

分配器与构造函数有什么关系吗?

不,如果您有特殊的内存管理要求,并且不希望向量简单地在堆上分配内存,则使用分配器。那里使用是相当罕见的。

在分配类的实例后立即填充类字段的常用过程

在构造函数中初始化所有数据成员是很常见的,是的。

于 2013-10-31T07:56:28.983 回答
2

您不需要指定类型以外的任何内容。

vector<person> people;
people.emplace_back(/* constructor arguments for a person */);  // constructs the person in place instead of copying into the vector.

person p;
p.stuff();
vector.push_back(p);  // copies p into the vector

等。基本上分配器和其他字段的默认值已经足够好了,除非您有理由覆盖默认行为,否则无需指定它们。我从来没有理由这样做。

于 2013-10-31T07:48:25.053 回答