如果我在头文件中声明了一个对象,则会出现编译错误。但是,我可以在我的应用程序的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);
}
答案 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);