gpt4 book ai didi

c++ - 具有责任转移的转换构造函数

转载 作者:行者123 更新时间:2023-11-28 03:45:45 24 4
gpt4 key购买 nike

这是 this 的跟进问题。

我需要实现一个转换操作,将成员对象的责任从一个对象传递给另一个对象。转换操作发生在类层次结构中。有一个 Base 类和两个派生类,比如 Child1Child2。在 Base 类中,有一个动态创建的对象,我需要在转换发生时将其从 Child1 传递给 Child2(连同职责),并且不要让 Child1 的析构函数破坏它。我写了一个简单的例子来说明我想要实现的目标:

#include <iostream>
using namespace std;

class Base {
public:
Base() {
p_int = new int; *p_int = 0;
cout << "In Base constructor, reserving memory." << endl;
}
Base(const Base& other) : p_int(other.p_int), a(other.a) {
cout << "In Base copy-constructor." << endl;
}
virtual ~Base() { delete p_int; p_int = NULL; cout << "Freeing memory." << endl; }

void setpInt(int val) { *p_int = val; }
void setInt(int val) { a = val; }
virtual void print() {
cout << "Base: ";
cout << (long)p_int << ":" << *p_int << " " << a << endl;
}
protected:
int* p_int;
int a;
};

class Child1 : public Base {
public:
Child1() : Base() {};
Child1(const Base& base) : Base(base) {}

void print() {
cout << "Child1: ";
cout << (long)p_int << ":" << *p_int << " " << a << endl;
}
};

class Child2 : public Base {
public:
Child2() : Base() {};
Child2(const Base& base) : Base(base) {}

void print() {
cout << "Child2: ";
cout << (long)p_int << ":" << *p_int << " " << a << endl;
}
};

int main() {
Child1* c1 = new Child1();
c1->setpInt(3);
c1->setInt(2);
c1->print();

Child2* c2 = new Child2(*c1);
c2->print();

delete c1; //Obviously c1's destructor is called here.
c2->print();

delete c2;

return 0;
}

结果是:

In Base constructor, reserving memory.
Child1: 158711832:3 2
In Base copy-constructor.
Child2: 158711832:3 2
Freeing memory.
Child2: 158711832:0 2
Freeing memory.

有没有办法以干净的方式做我想做的事情?我不能复制构造 p_int 因为它很重。该项目是一个嵌入式 AVR 项目,因此智能指针或 boost 库可能不可用(不过我不知道)——我只记得这可能是一个解决方案,但我从未使用过它们。

最佳答案

我认为您需要查看引用计数 对象。本质上,对象本身会跟踪它的使用情况,而不是存储指向对象的原始指针,而是使用引用计数的指针。

Scott Meyers 在这里谈到了这个:

http://www.aristeia.com/BookErrata/M29Source.html

由于您使用的是嵌入式系统,我不确定您是否可以使用 boost::shared_ptr<>但正如 Meyers 概述的那样,没有什么能阻止您实现它。

因此,与其在基类中有一个指向相关对象的原始指针,不如有一个共享指针/引用计数指针,一旦对象被复制到 Child2 中,它将防止对象被删除。 .通过构造 Child2,它将有 2 个引用,因此当 Child1 被删除时不会死亡。然而,当 Child2 被删除时,它会。

关于c++ - 具有责任转移的转换构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7766771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com