通过值传递对象并在C++中对其进行修改
Passing object by value and modifying it in C++
我正在使用的书希望我使用C++中的构造函数来实现LIFO堆栈。第一个实现相当简单,因为它希望我通过引用传递函数中的对象(因此下面的代码有一个额外的&in-pushexternal函数)。然而,我不知道如何正确地实现它的第二个版本。它希望我通过按值传递对象来实现它。因此,它创建了对象的副本,在堆栈上使用push函数后,push元素就不见了。我不知道在传递值时如何正确地执行它。我曾想过以某种方式使用复制构造函数,但我尝试过,但似乎不起作用。。。
这是书中写的代码。我不应该修改它,我只能写我自己的类/附加函数:
void pushexternal(Stack s, int a) {
s.push(a);
}
int main() {
Stack s;
s.push(0);
s.push(1);
s.push(2);
pushexternal(s, 3);
pushexternal(s, 4);
return 0;
}
这是我实现的一部分:
#include <iostream>
using namespace std;
class Stack {
public:
int ind;
int * arr;
Stack()
{
arr = new int[25];
ind = -1;
}
~Stack()
{
delete [] arr;
}
void push(int val)
{
arr[++ind] = val;
cout << "Added " << arr[ind] << " to " << ind << endl;
}
};
我知道这里不建议按值传递,但我真的想知道,当按值传递是强制性的时,我该如何使其正常工作。我唯一想到的就是写一个复制构造函数。。。?当然,我的代码在这里不起作用,因为它生成了一个应该推送变量的副本,但当传递值时,当它退出函数时,它就不见了。。。
这个程序的结果应该是这样的:
Added 0 to 0
Added 1 to 1
Added 2 to 2
Added 3 to 3
Added 4 to 4
如果要在arr
成员中分配一个额外的成员,则可以使用arr[0]
而不是ind
作为索引。这样,即使堆栈对象是按值复制的,arr
指针仍将指向相同的内存。
类似的,可能更复杂的解决方案也存在,包括让对象包含一个指向同时包含ind
和arr
的结构的指针
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- 已修改的LinkedList未在文本文件本身中更新
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 为什么可以修改数组 b?
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 修改的Fibbonaci C++得到一个大的负数
- clang 插件:在编译过程中修改 AST