C ++ создать указатель на новый класс - PullRequest
0 голосов
/ 06 января 2011

У меня проблема с этим кодом. Я хочу создать указатель на новый класс

class AnalyzerManager
{

public:

    AnalyzerManager();
    ~AnalyzerManager();
private:
    CAnalyzerIF* m_AnalyzerIF = new CAnalyzerIF();

};

В нем есть ошибка компиляции, я не понимаю, как ее исправить.спасибо

Ответы [ 4 ]

4 голосов
/ 06 января 2011

Вы должны инициализировать указатель в вашем конструкторе, а не в объявлении класса.

AnalyzerManager::AnalyzerManager() : m_AnalyzerIF(new CAnalyzerIF())
{
}

Кстати, вы можете посмотреть умные указатели на что-то вроде этого.

1 голос
/ 06 января 2011

Вы должны начать с вопроса: когда я хочу, чтобы этот «новый» оператор выполнялся?

Предполагая, что ответ заключается в построении объекта AnalyzerManager, тогда место для «нового» находится в конструкторе AnalyzerManager.

Код, помещенный в конструктор, который инициализирует переменные-члены, обычно выполняется с использованием списка инициализации членов, например:

AnalyzerManager::AnalyzerManager() : m_AnalyzerIF(new CAnalyzerIF())
{
}

Поскольку вы используете 'new', вы должны подумать, куда пойдет 'delete' - предположительно в деструкторе AnalyzerManager:

AnalyzerManager::~AnalyzerManager()
{
    delete m_AnalyzerIF;
}
1 голос
/ 06 января 2011
// in AnalyzerManager.h
#include <memory>

class AnalyzerManager
{
public:
    AnalyzerManager();
    ~AnalyzerManager();

 // since you are declaring a custom constructor and destructor, you should also define a custom copy-constructor and copy-assignment
 AnalyzerManager(const AnalyzerManager& rhs);
 AnalyzerManager& operator= (const AnalyzerManager& rhs);
private:
    std::shared_ptr<CAnalyzerIF> m_AnalyzerIF;
};

// in AnalyzerManager.cpp
AnalyzerManager::AnalyzerManager() : m_AnalyzerIF(new CAnalyzer)
{

}

AnalyzerManager::~AnalyzerManager()
{
    // nothing to do since shared_ptr will clean up the memory for us 
}

AnalyzerManager::AnalyzerManager(const AnalyzerManager& rhs) : m_AnalyzerIF(rhs.m_AnalyzerIF)
{

}

AnalyzerManager& AnalyzerManager::operator= (const AnalyzerManager& rhs)
{
    m_AnalyzerIF = rhs.m_AnalyzerIF;
 return *this;
}
0 голосов
/ 06 января 2011

Вы не можете делать так, как написали.Я имею в виду прямо в объявлении.

CAnalyzerIF* m_AnalyzerIF = new CAnalyzerIF();

Вместо этого вы должны сделать это в конструкторе AnalyzerManager().

AnalyzerManager::AnalyzerManager()
{
  m_AnalyzerIF = new CAnalyzerIF();
  // ... and some more initialization ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...