麻烦声明包含类型的对象

时间:2011-07-15 18:20:48

标签: c++ constructor

如果我在头文件中声明了一个对象,则会出现编译错误。但是,我可以在我的应用程序的setup()方法中构建它,只需调用Analyzer A(44100., "a", 200);

如果我这样构造它,我该如何保持指针呢?一旦构造函数调用超出范围,对象是否无法访问?

或者,我是否应该采用另一种方式获取此对象的实例?

(我习惯于将Analyzer A;放在我的标题中,然后放入cpp放置A = new Analyzer(44100., "a", 200);。但是,这不会编译。)

Analyzer.hh:

class Analyzer {
  public:
    /// constructor
    Analyzer(double rate, std::string id, std::size_t step = 200);
};

Analyzer.cc:

Analyzer::Analyzer(double rate, std::string id, std::size_t step):
  m_step(step),
  m_rate(rate),
  m_id(id),
  m_window(FFT_N),
  m_bufRead(0),
  m_bufWrite(0),
  m_fftLastPhase(FFT_N / 2),
  m_peak(0.0),
  m_oldfreq(0.0)
{
/* ... */
}

testApp.h:

#include "Analyzer.hh"

class testApp : public ofSimpleApp{
public:

// *This line gives compilation error 
// "No matching function for call to Analyzer::Analyzer()"

      Analyzer A;
    }

testApp.cpp:

void testApp::setup(){

// *This line compiles, but how will I access 
//this object outside of current scope?*
  Analyzer A(44100., "a", 200);
}

3 个答案:

答案 0 :(得分:2)

您可以初始化A的构造函数类型 在testApp的构造函数中作为

testApp:testApp():A(44100., "a", 200){
//testApp constructor. 
}

答案 1 :(得分:0)

您需要从头学习C ++。您试图从Java或C#等语言中引用参考语义,而C ++中则不存在这些语义。你需要一个C ++方法。

Analyzer A;是一个值。它是直接构建的。如果使用成员变量,则必须使用初始化列表构造它。

testApp::testApp()
: A( args ) {}

在函数本地范围内时,传统上您返回对象的副本,或使用自己拥有的智能指针(如shared_ptr)来保存对象。在C ++中,除非实际需要动态生命周期,否则不要求助于动态分配 - 如果需要,可以为基于堆栈的变量设置别名。

答案 2 :(得分:-1)

Analyzer A; - > Analyzer *A;Analyzer A(44100., "a", 200); - > A = new Analyzer(44100., "a", 200);