2012-03-13 3 views
0
class A : boost::noncopyable{ 
}; 
class B{ 
    A & conn() const; 
}; 

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

  • соппы должны создавать и возвращать ссылку на объект типа А.
  • я не могу сломать B в клиентском коде с использованием B.
  • Я хочу, чтобы мой код не пропускал память, поэтому я не могу просто вернуть ссылки на объекты в куче.

Я не нашел реализации интеллектуальных указателей, которые не нарушали бы клиентский код, так как нет никакого преобразования в тип A *, и я оставил код клиента нетронутым, тогда у меня были бы утечки памяти.

С уважением,

+0

Почему вы возвращаете ссылку? Кроме того, я не уверен, что вы имеете в виду о умных указателях; где вам нужно преобразовать в 'A *'? –

+0

Должен ли conn() создавать новый экземпляр каждый раз, когда он вызывается? – juanchopanza

+0

@juanchopanza: yes – user311174

ответ

2

Вы можете удовлетворить ваши три требования, создав смарт-указатель (std::unique_ptr) в новый A, поместите его в контейнер элементов данных таких интеллектуальных указателей и верните ссылку на объект, управляемый умный указатель. Вы должны были бы объявить контейнер mutable, хотя, поскольку ваш метод conn() - это const. Я не говорю, что это хороший дизайн, но только для удовлетворения ваших требований. Например, с помощью C++ 11:

class B { 

public: 
    inline A& conn() const { 
    data_.emplace_back(new A); 
    return *(data_.back().get()); 
    } 

private: 
    mutable std::vector<std::unique_ptr<A>> data_; 
}; 

Срок службы всех объектов А привязывается к B. BTW иметь в виду, что ваш интерфейс обеспечивает неконстантная ссылки на объекты, с помощью константный метод. Это не очень хорошо!

+0

+1. Это идея, которую я имел в своей голове, но слишком ленив, чтобы ответить на вопрос ... –

1

возвращает ссылку на статический объект на уровне функций:

A& b::conn() const 
{ 
    static A theA; 
    return theA; 
} 

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

+0

ОК, но это не соответствует требованию «создавать и возвращать» в вашем коде, который происходит один раз. – user311174

+0

Ну, в этом случае у вас может быть статический вектор указателей на A - опять я не говорю, что это правильное решение !!! – Nick

0

Вы должны добавить A экземпляр в качестве члена данных B, чтобы иметь возможность возвращать ссылку (или использовать статический экземпляр внутри conn, но приносит массу неприятностей и следует избегать как огня). Это не нарушает API, но это нарушит ABI.

Смежные вопросы