Re[5]: Сокрытие не-public членов классов
От: MaximE Великобритания  
Дата: 22.01.03 16:55
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, MaximE, Вы писали:


ME>>Undefined behavior могло бы возникнуть, если бы я не определил деструктор у DataMapper. В этом случае компилятор сгенерировал бы деструктор по-умолчанию в каждом объектнике, пользующем DataMapper, что и было бы причиной undefined behavior.


ssm>открываем стандарт и смотрим пункт 17.4.3.6, а именно последнюю часть:


ssm>In particular, the effects are undefined in the following cases:


ssm>-if an incomplete type(3.9) is used as template argument when instanting a template component


ssm>что и имеет место в приведенном тобой коде


Это так. Но пользователем этой структуры является только DataMapper. В *.cpp DataMapperImpl полностью определен и вызов ~auto_ptr<DataMapperImpl> происходит только из определенного деструктора DataMapper, что не приводит к неопределенному поведению.
Это тоже самое, как если бы я написал так:

class DataMapper : public Reference
{
public:
    DataMapper();
    ~DataMapper();
private:
    //const std::auto_ptr<struct DataMapperImpl> _pimpl;
    struct DataMapperImpl* _pimpl;
};



///////////////////////////////////////////////////////////////////////////////

struct DataMapperImpl
{
    DataMapperImpl() : _connection(__uuidof(Connection))
    {
        _connection->Open(sqlConnection, _bstr_t(), _bstr_t(), adConnectUnspecified);
    };

    _ConnectionPtr _connection;
};

///////////////////////////////////////////////////////////////////////////////

DataMapper::DataMapper()
    :    _pimpl(new DataMapperImpl)
{
}

///////////////////////////////////////////////////////////////////////////////

DataMapper::~DataMapper()
{
    delete _pimpl;
}


Рекоммендую, все-таки, почитать Саттера по вышеприведенной ссылке
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.