Я не уверен, что точно знаю, что вы спрашиваете. Конструкторы всегда нужно вызывать для объектов, находятся ли они в куче или в стеке. Если вы имели в виду, что вы хотите, чтобы что-то автоматически вызывало деструкторы для выделенной памяти кучи, тогда вы можете использовать либо 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.