使用指针初始化引用:是否有任何陷阱?还有其他选择吗? (C ++)

时间:2017-06-20 12:54:31

标签: c++ pointers reference

由于绝望时间需要胡思乱想的措施,我在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 filethe .h file

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

使用指针作为成员,但具有返回引用的访问者Foo &GetFoo() {return *pmyFoo;}。将该成员设为私有,并在任何地方使用访问者,即使在类的代码中也是如此。

除了那个方法(哦,以及释放它的dtor),就所有代码而言,没有指针,只有引用。