1.a*_*x.2 1 c++ class vector std allocator
我真的没有得到模板std :: vector的字段,第一个指定类型,例如一个类,但我没有得到分配器,指针和引用变量.
我将提供一个简单的例子,我想使用类人的向量,所以我不得不对模板向量说:嘿,存储我一些人的,但我还必须告诉向量如何分配该类.(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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想你必须在class person中声明一个函数,称为allocator,它是在你调用时作为第二个参数传递的,(3)如何定义分配器函数?:
vector <person*, /*some allocator call*/> ImAVector;
Run Code Online (Sandbox Code Playgroud)
然后,(4)我怎么能在向量中推送一些东西,(5)这会起作用吗?:
person* someperson;
someperson.person(/*arguments*/);
ImAVector.push_back(someperson);
Run Code Online (Sandbox Code Playgroud)
(6)我如何检索指向特定实例的指针?(7)我可以使用迭代器做这样的事情吗?:
//(6)
person* = ImAVector[someIterator];
//and then (7)
ImAVector[someIterator].setName(someConstCharPointer);
string* something = person.getName();
Run Code Online (Sandbox Code Playgroud)
另外,(8)分配器是否与构造函数有关?(9)在分配类实例后立即填写类的字段的常用程序?(10)分配器可以调用构造函数吗?
最后一个问题:(11)什么是参考字段,指针字段和它们的const对应物?
我知道它写了很多东西,但是我花了最近两天的时间来寻找没有成功的例子,所以如果有人对这个很少讨论的话题有所了解,那将会很好,我已经将所有问题都计算在内以便于回答.
我感谢任何答案:)
对于该示例,如何使用正确的语法?
除非你有充分的理由存储指针,否则不要.然后你就宣布了
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));
Run Code Online (Sandbox Code Playgroud)
并且为您管理所有分配.
想要指针的原因包括:
person是一个基类,你想存储各种不同的子类型.在这种情况下,我认为你不能使用分配器来提供帮助; 相反,您可以存储智能指针,以便在从容器中删除指针时自动删除对象:
std::vector<std::unique_ptr<person>> people;
people.push_back(std::unique_ptr<person>(new person(id, name, surname, birthday)));
Run Code Online (Sandbox Code Playgroud)
另一种方法是处理原始指针并尝试在正确的时间删除对象; 但生活对于那些胡言乱语来说太短暂了.
(2)我应该使用
date*?
对于大型或复杂的课程,通过const参考可能是有益的const date&; 但是这个类很简单,可以通过值传递.传递指针会很奇怪,除了像C这样的语言,这是通过引用传递的唯一方法.
我怎么能检索到特定实例的指针?
people[index]给具有该索引的人提供引用(而不是指针).如果您出于某种原因确实需要指针,请使用&以获取地址:
person & ref = people[index];
person * ptr = &ref;
Run Code Online (Sandbox Code Playgroud)
我可以使用迭代器来做这样的事情吗?
不,[]用于通过数组索引访问,而不是取消引用迭代器.如果你有一个迭代器it,那么*it给你一个对象的引用.
分配器与构造函数有什么关系?
不,如果您有特殊的内存管理要求,并且不希望向量简单地在堆上分配内存,则使用分配器.使用非常罕见.
在分配类的实例后立即填充类的字段的常用过程
初始化构造函数中的所有数据成员是常见的,是的.
| 归档时间: |
|
| 查看次数: |
2308 次 |
| 最近记录: |