gpt4 book ai didi

c++ - 使用指针 : Are there any pitfalls? 初始化引用有没有其他选择? (C++)

转载 作者:行者123 更新时间:2023-11-27 22:44:40 25 4
gpt4 key购买 nike

由于绝望的时代需要古怪的措施,我在 C++ 中实现了以下内容。

-- 有一个名为 foo 的类。我需要一个名为 bar 的类中的 foo 实例(对象或引用,而不是指针)。
-- 我不想在 bar.h 中将 foo 声明为一个对象,因为我不想在 bar.h 中包含 foo.h。原因是 bar.h 包含在项目的大约一百个 .cpp 文件中,并且在 bar.h 中包含 foo.h 会大大增加编译时间并带来意大利面条。
-- 我不想对前向 foo 进行分类并将其声明为指针,因为我们正试图避免像瘟疫这样的指针。
-- bar 的构造函数不通过参数传递 foo 的实例。

所以我这样做了:

这是 foo.h(foo.cpp 是很多数学但在这个论点中并不重要):

#ifndef FOO_H
#define FOO_H

class bell;

class foo {
public:
foo(const bell& bell_i);
virtual ~foo();
double foo_member(); /*does math in foo.cpp*/
};
#endif /* FOO_H */

这是 bar.h:

#ifndef BAR_H
#define BAR_H

class bell;
class foo;

class bar {
public:
bar(const bell& bell_i);
virtual ~bar();
double bar_member(); /* does math in bar.cpp and uses foo */
private:
foo& myfoo;
};
#endif /* BAR_H */

这是 bar.cpp:

#include "bell.h"
#include "foo.h"

bar::bar(const bell& bell_i) : myfoo(*(new foo(bell_i))) /* NOTE: this construction is my question. */
{}

bar::~bar()
{}

double bar::bar_member()
{
return sqrt(myfoo.foo_member());
}

所以,本质上,我正在创建一个指向 foo 的指针,从中获取对象并初始化 myfoo。这段代码和所有关联的代码都可以完美编译并运行而不会出现任何错误。我已经用多个编译器对其进行了测试。

我的问题是:

-- 像这样初始化 myfoo 在代码方面(语法/生命周期/悬挂指针等)是否有任何错误?
-- 这样做在代码上有什么问题吗?
-- 我错过了什么吗?
-- 是否有不使用指针的替代方案?

如果您想查看真正的代码,请在此处查看:the .cpp file , the .h file .

提前致谢。我是一名物理学家。所以,请原谅我的代码术语。

更新:泄漏似乎不是问题,因为只有少数类的实例是在启动时构造的,并且在运行时没有被销毁,只有在退出时才被销毁。但是对于在运行时创建和销毁的类不应该这样做。

最佳答案

您的措施违背了这里的目的。无论如何,当您为 foo 实例分配内存时,您现在没有指针,而是内存泄漏,但您永远不会释放它。如果您需要使用指针/引用,但不想手动跟踪对象生命周期,您最好使用 RAII 方法,例如 std::unique_ptr .它会保留您的对象指针,并在时机成熟时小心地释放它。

关于c++ - 使用指针 : Are there any pitfalls? 初始化引用有没有其他选择? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44653655/

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