Проблема объявления объекта включенного типа - PullRequest
0 голосов
/ 15 июля 2011

Если я объявляю объект в моем заголовочном файле, я получаю ошибку компиляции. Однако я могу создать его в методе 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 ]

2 голосов
/ 15 июля 2011

Вы можете инициализировать конструктор типа A в конструкторе testApp как

testApp:testApp():A(44100., "a", 200){
//testApp constructor. 
}
0 голосов
/ 16 июля 2011

Вам нужно выучить C ++ с нуля.Вы пытаетесь перенести ссылочную семантику из языка, такого как Java или C #, а таких не существует в C ++.Вам нужен подход C ++.

Analyzer A; является значением.Он построен напрямую.Если вы используете переменную-член, вы должны создать ее с помощью списка инициализаторов.

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

Когда вы используете локальную область действия функции, обычно вы возвращаете копию объекта или используете собственный интеллектуальный указатель, напримерshared_ptr для удержания объекта.В C ++ вы не прибегаете к динамическому распределению, если вам на самом деле не нужно динамическое время жизни - вы можете использовать псевдонимы переменных стека, если вам это нужно.

0 голосов
/ 15 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...