gpt4 book ai didi

c++ - 指针和类,输出

转载 作者:行者123 更新时间:2023-12-02 10:16:26 26 4
gpt4 key购买 nike

提前致谢,

所以,我正在处理包含指针的类,最后一个是主题

如果我具有以下实例的类,则需要 push 来显示该类的指针(堆指针)针对的数据,知道它的目标是(指向) C-tor中的成员值(成员)。

一些纠正错误的帮助。

我添加了一个子类,仅用于继承的详细信息,如果可以添加一些有关的详细信息(如果有的话)。

如果我可以添加,我将获得7405304的母亲类和4997952的子类(而不是相应的预期输出的9和99),为什么会发生这种情况?

谢谢。

#include <iostream>

class Mother {
public:
Mother(int member) {
mem = new int; /*Heap Ptr*/

mem = &member;

std::cout << "C-tor" << std::endl;
}

~Mother() {
delete mem;
*mem = 0;

std::cout << "D-tor" << std::endl;
}

virtual void display() const {
std::cout
<< *mem
<< std::endl; /*What should i put here ? I've an unexpected value */
}

private:
int* mem = 0;
};

class Child : public Mother {
public:
Child(int a) : Mother(a) {}
~Child() {}
};

void data(Mother const* m) {
m->display();
}
int main() {
int a(9), b(99);

Child child(a);
Mother mother(b);

data(&mother);
data(&child);

return 0;
}

最佳答案

仅对您的代码添加几个注释。最重要的是,继承对一切都很好。不需要将display函数声明为虚拟函数,因为这假定您将在Child中重新定义它,而您无需这样做。简而言之,所有的弊端都来自于mem指针。在针对母亲的析构函数中,您有以下内容:

delete mem;
*mem = 0;

从逻辑上讲这没有意义。在 delete mem之后,指针不存在,因此下一行取消引用了刚删除的指针。让我们关注指针 mem的生命周期。首先在 private中创建它,然后将其重新分配给通过 new int创建的新指针,然后再次将其重新分配给 &member(这意味着析构函数中的 delete mem不会查看 new int指针,而是查看 &member)。如果您像这样解决这些问题
class Mother {
public:
Mother(int member) {
*mem = member;

std::cout << "C-tor" << std::endl;
}

~Mother() {
delete mem;

std::cout << "D-tor" << std::endl;
}

void display() const {
std::cout
<< *mem
<< std::endl; /*What should i put here ? I've an unexpected value */
}

private:
int * mem = new int;
};

class Child : public Mother {
public:
Child(int a) : Mother(a) {}
~Child() {}
};

void data(Mother const * m) {
m->display();
}


int main() {
int a(9), b(99);

Child child(a);
Mother mother(b);

data(&mother);
data(&child);

return 0;
}

您应该获得正确的输出。

关于c++ - 指针和类,输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61786416/

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