Какова лучшая практика в C ++ для объявления объектов внутри классов? - PullRequest
0 голосов
/ 13 октября 2010

Я работаю над библиотекой классов в VC ++, которая должна иметь ref-классы и некоторый нативный код. Теперь мне нужно использовать пять нативных объектов из внешней среды. эти объекты должны быть объявлены в куче, а НЕ в стеке. Я хочу заключить эти объекты в некую структуру, зная, что нужно вызывать конструкторы.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 октября 2010

Вы должны обернуть shared_ptr так:

template <class T>
class my_object_wrapper
{
  boost::shared_ptr<T> ptr; // or std::tr1::shared_ptr<T> if available
public:
   my_object_wrapper()
   : ptr(new T)
   {
   }

   boost::shared_ptr<T> ptr() const { return ptr; }
}

Вы также можете использовать подход pheonix:

template <class T>
class my_object_wrapper
{
  boost::shared_ptr<T> ptr; // or std::tr1::shared_ptr<T> if available
public:
   my_object_wrapper()
   {
   }

   boost::shared_ptr<T> ptr() 
   { 
     if (ptr == null)
       ptr = new T;

     return ptr;
   }
}
0 голосов
/ 13 октября 2010

Я не уверен, что точно знаю, что вы спрашиваете. Конструкторы всегда нужно вызывать для объектов, находятся ли они в куче или в стеке. Если вы имели в виду, что вы хотите, чтобы что-то автоматически вызывало деструкторы для выделенной памяти кучи, тогда вы можете использовать либо std :: auto_ptr , либо boost :: shared_ptr . Обратите внимание, что они не эквивалентны, поэтому прочитайте документацию! Автоматические указатели нельзя использовать в стандартных контейнерах, так как они не имеют необходимой семантики копирования, тогда как boost :: shared_ptr может подсчитывать ссылки при копировании.

Чтобы ответить на ваш более общий вопрос о передовых практиках объявления, вы хотите только полностью объявлять объекты, которые вам нужно, и пересылать, когда это возможно. Например, если у вас есть класс вроде:

// In X.h
class MyConfig;
class X
{
    X(const MyConfig &config);

private:
    const MyConfig &config;
};

// In X.cpp
#include "MyConfig.h"
X::X(const MyConfig &config) : config(config)
{

}

Здесь вам не нужно полное объявление, содержащееся в MyConfig.h в заголовочном файле X.h. Вы можете сделать это, потому что вам не нужно знать размер объекта MyConfig для создания класса X, поскольку он содержит только ссылку одинакового размера независимо от того, какой объект лежит в основе. Это поможет с зависимостями, а также сократит время компиляции.

Если, с другой стороны, конфигурация закрытого члена была изменена на const MyConfig x;, то вам нужно было бы включить заголовок MyConfig.h в Xh, потому что для создания класса X требуется знание того, сколько памяти выделить для хранения объекта MyConfig.

0 голосов
/ 13 октября 2010

Что ж, для каждого неуправляемого класса X объявите класс ref XWrapper, который хранит неуправляемый указатель на X конфиденциально, new в конструкторе и delete в деструкторе.Почему нет?

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