如何将 class 中指向另一个 class 的指针复制到 C++ 中的另一个指针?
How can I copy a pointer to another class within a class to another pointer in C++?
换句话说,我怎样才能将不同 class 中的 class 类型的指针复制到相同 class 类型的另一个指针.
举个例子:
class Bananas
{
private:
int peel;
string color;
};
class Apples
{
private:
Bananas *ptr1;
Bananas *ptr2;
public:
void copyPointers();
};
在上面的例子中,我需要将ptr1的值复制到ptr2。
注:ptr2为空。
失败的尝试 #1:
memcpy(ptr2, ptr1, strlen(ptr1)+1);
失败的尝试#2:
ptr2 = ptr1;
更新:
进一步解释我的功能:
void Apples::copyPointers()
{
ptr2 = ptr1;
}
如果需要拷贝指针的值(内存地址):
ptr2 = ptr1;
现在 ptr2
将指向与 ptr1
相同的对象。
如果您需要复制ptr1
指向的对象,并将新对象赋值给ptr2
:
ptr2 = new Bananas(*ptr1);
这将使用 ptr1
指向的对象调用 Bananas
复制构造函数。之后记得 delete ptr2
(或使用 std::unique_ptr
自动为您完成这项苦差事)。
#include <iostream>
using namespace std;
int main() {
int *ptr1;
int *ptr2;
ptr2 = ptr1;
*ptr1 = 21;
std::cout << *ptr2 << std::endl;
return 0;
}
似乎工作正常。
我不明白为什么 ptr2 = ptr1
不起作用。
但是,如果您创建 Bananas 的一个实例,然后将其取消引用到 ptr1 中,则会为 ptr1 分配一个新值;但 ptr2 仍将具有旧值...指向 Bananas 类型的空值。
编辑:
使用结构的扩展示例(类 变相):
#include <iostream>
using namespace std;
struct A
{
int val;
};
int main() {
A a;
A *ptr1;
A *ptr2;
ptr2 = ptr1; // ptr1 is nothing, so ptr2 is the same nothing now.
ptr1 = &a; // ptr1 is now something! But ptr2 is still the old nothing.
ptr1->val = 21;
ptr2 = ptr1; // Assign ptr1's something to ptr2's nothing
std::cout << ptr2->val << std::endl; // ptr2 is now pointing at the same object as ptr1.
return 0;
}
所以首先你需要一个 Banana 的拷贝构造函数。
class Banana {
Banana (const Banana& b): peel(b.peel), color(b.color) {}
};
然后,在 Apple 内部,您从旧香蕉构建了一个新香蕉
Banana* ptr2 = new Banana(*ptr1);
我不清楚你为什么要使用指针,但你知道了。
如果要删除第一个 Banana,
delete ptr1;
换句话说,我怎样才能将不同 class 中的 class 类型的指针复制到相同 class 类型的另一个指针.
举个例子:
class Bananas
{
private:
int peel;
string color;
};
class Apples
{
private:
Bananas *ptr1;
Bananas *ptr2;
public:
void copyPointers();
};
在上面的例子中,我需要将ptr1的值复制到ptr2。
注:ptr2为空。
失败的尝试 #1:
memcpy(ptr2, ptr1, strlen(ptr1)+1);
失败的尝试#2:
ptr2 = ptr1;
更新:
进一步解释我的功能:
void Apples::copyPointers()
{
ptr2 = ptr1;
}
如果需要拷贝指针的值(内存地址):
ptr2 = ptr1;
现在 ptr2
将指向与 ptr1
相同的对象。
如果您需要复制ptr1
指向的对象,并将新对象赋值给ptr2
:
ptr2 = new Bananas(*ptr1);
这将使用 ptr1
指向的对象调用 Bananas
复制构造函数。之后记得 delete ptr2
(或使用 std::unique_ptr
自动为您完成这项苦差事)。
#include <iostream>
using namespace std;
int main() {
int *ptr1;
int *ptr2;
ptr2 = ptr1;
*ptr1 = 21;
std::cout << *ptr2 << std::endl;
return 0;
}
似乎工作正常。
我不明白为什么 ptr2 = ptr1
不起作用。
但是,如果您创建 Bananas 的一个实例,然后将其取消引用到 ptr1 中,则会为 ptr1 分配一个新值;但 ptr2 仍将具有旧值...指向 Bananas 类型的空值。
编辑: 使用结构的扩展示例(类 变相):
#include <iostream>
using namespace std;
struct A
{
int val;
};
int main() {
A a;
A *ptr1;
A *ptr2;
ptr2 = ptr1; // ptr1 is nothing, so ptr2 is the same nothing now.
ptr1 = &a; // ptr1 is now something! But ptr2 is still the old nothing.
ptr1->val = 21;
ptr2 = ptr1; // Assign ptr1's something to ptr2's nothing
std::cout << ptr2->val << std::endl; // ptr2 is now pointing at the same object as ptr1.
return 0;
}
所以首先你需要一个 Banana 的拷贝构造函数。
class Banana {
Banana (const Banana& b): peel(b.peel), color(b.color) {}
};
然后,在 Apple 内部,您从旧香蕉构建了一个新香蕉
Banana* ptr2 = new Banana(*ptr1);
我不清楚你为什么要使用指针,但你知道了。 如果要删除第一个 Banana,
delete ptr1;