C++自己的对象堆栈.在 push() 上复制了什么?

C++ own Stack of objects. What is copied at push()?

本文关键字:复制 什么 对象 自己的 堆栈 push C++      更新时间:2023-10-16

好吧,我在类中实现了一个FIFO堆栈(push,pop(堆栈,其中分配了mem整数。 所以我问自己:如果"int"是一个数据类型,为什么我不能将"ADT"推送到我自己的堆栈。

然后我带来了这段代码:

#include <iostream>
class Person {
std::string name;
int age;
public:
Person(std::string pName = "", int pAge = 1)
{
name = pName;
age = pAge;
}
void Print()
{
std::cout << name << " " << age << std::endl;
}
};
class Stack {
Person * stack;
int size, top;
int index;
public:
Stack(int stackSize)
{
top = stackSize -1;
index = top;
stack = new Person[stackSize];
}
void push(Person person)
{
if (index < 0)
std::cout << "Stack UNDERFLOW" << "Index is: " << index << std::endl;
stack[index--] = person;
}
Person & pop()
{
if (index > top)
{
std::cout << "Stack OVERFLOW" << std::endl;
}   
return stack[++index];
}
};

我知道,STL 库中有堆栈、队列、vectos 等。我只是想自己做。 我希望堆栈推送对象的副本。 我不确定我不知道编译器是否在推送地址,复制整个对象(我想要什么(或什么。

请启发我。

这是我的主((代码:

int main()
{
Stack stack(100);
Person person("Lucas", 39);
for (int i = 0; i < 100; i++)
{   
stack.push(person);
((Person)stack.pop()).Print();
}
return EXIT_SUCCESS;
}

要回答您关于副本的问题,请:

stack[index--] = person;

创建副本,因为作业两面的类型均为T类型。

这:

stack.push(person);

还会复制,因为您正在按值传递person。 若要避免此(冗余(副本,请将push声明为:

void push(const T &person)

好吧,我为解决我的问题所做的就是@PaulMcKenzie在他的评论中所说的。 我为"堆栈"类创建了一个模板,任何模板"T"都是传递给这个类的数据类型。 关于主要方法(在我的问题中(,它对(人(有一个不必要的投射,因为它是暗示的。 编辑 2: @Paul桑德斯也是对的,我在push((上做了一个冗余的副本

这样我解决了我的问题:

#include <iostream>
class Person {
std::string name;
int age;
public:
Person(std::string pName = "", int pAge = 1)
{
name = pName;
age = pAge;
}
void Print()
{
std::cout << name << " " << age << std::endl;
}
};
template <class T>
class Stack {
T * stack;
int size, top;
int index;
public:
Stack(int stackSize)
{
top = stackSize -1;
index = top;
stack = new T[stackSize];
}
void push(const T &person)
{
if (index < 0)
std::cout << "Stack UNDERFLOW" << std::endl;
stack[index--] = person;
}
T pop()
{
if (index > top)
{
std::cout << "Stack OVERFLOW" << std::endl;
}   
return stack[++index];
}
};
int main()
{
Stack<Person> stack(100);
Person person1("Lucas", 39);
Person person2("Gustavo", 38);
for (int i = 0; i < 100; i++)
{
if (i % 2 == 0)
stack.push(person1);
else
stack.push(person2);
}   
for (int i = 0; i < 100; i++)
stack.pop().Print();
return EXIT_SUCCESS;
}

在 main(( 函数的示例中,它创建了一个 100 的 Person 对象堆栈。然后我创建 2 个人:"卢卡斯"和"古斯塔沃"并将其插入我的堆栈 100 次(第一次用于语句(。 然后第二个也是最后一个语句 pop(( 所有值并打印出来。