由于绝望时间需要胡思乱想的措施,我在C ++中实现了以下内容。
- 有一个名为foo的类。我需要一个名为bar的类中的foo实例(对象或引用而不是指针)
- 我不想将foo声明为bar.h中的对象,因为我不想在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。
提前致谢。我是一名物理学家。所以,请原谅我的代码术语。
答案 0 :(得分:4)
你的措施无视这里的目的。当你为foo实例分配内存时,你现在有了内存泄漏而不是指针,但是你永远不会释放它。如果您需要使用指针/引用,但不想手动跟踪对象生命周期,则最好使用RAII方法,例如std::unique_ptr。它会保留你的对象指针,并在时机成熟时小心地释放它。
答案 1 :(得分:0)
使用指针作为成员,但具有返回引用的访问者Foo &GetFoo() {return *pmyFoo;}
。将该成员设为私有,并在任何地方使用访问者,即使在类的代码中也是如此。
除了那个方法(哦,以及释放它的dtor),就所有代码而言,没有指针,只有引用。