Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Если одно из полей класса - ссылка...


Автор: Alek86 21.12.2007, 20:08
скрпировал с прошлой своей темы, так как этот вопрос к ней не относится

http://www.boost.org/doc/html/signals/tutorial.html#id1628358 встретился такой класс

Код

class View
{
public:
    View(Document& m)
        : m_document(m)
    {
        m_connection = m_document.connect(boost::bind(&View::refresh, this, _1));
    }

    virtual ~View()
    {
        m_document.disconnect(m_connection);
    }

    virtual void refresh(bool bExtended) const = 0;

protected:
    Document&               m_document;

private:
    Document::connection_t  m_connection;
};


что случится, если я сделаю

Document doc;
View view1(doc);

View view2(view1); // ???

View view3(doc);
view3 = view1;       // ???

это что, ошибка при создании класса (из-за того, что писали его не как реальный)?
просто такое "упущение" я встречаю не первый раз в умных источниках

или тут вообще никакого упущения нет?

Автор: srd 21.12.2007, 20:24
Для подобных классов компилятор не генерирует конструктор копирования и оператор присваивания по умолчанию. Соответственно,  строчки // ??? компилироваться не будут smile Если нужно копирование/присваивание, пиши конструктор/оператор сам.

Автор: Alek86 21.12.2007, 20:49
Код

struct C1 {
  C1(int& i) : m_i(i) {}
  int& m_i;
};

int main()
  {
  int i = 1;
  C1 c1(i);
  C1 c2(c1);
  }


VS 2005 компилирует

Добавлено @ 20:49
так
Код
c2 = c1;

не компилит, правда, но все же

Автор: srd 21.12.2007, 21:16
Ага, ошибся. Конструктор копирования всё-таки генерируется и работает. Хотя, для меня это неожиданно.

Автор: crazy_hand 21.12.2007, 22:21
Может я чего-то не понимаю, но:

Alek86, если ты так сделаешь - то будет ошибка, так как там чисто виртуальная функция.
srd, конструктор копирования и оператор присваивания всегда для классов автоматически создаются.

Поправьте, если я не прав.

Автор: archimed7592 21.12.2007, 23:45
crazy_hand, причём тут виртуальные ф-ции? 0_о

Создаются не всегда. Есть несколько правил, когда они неявно объявляются, когда неявно определяются. В двух словах: неявно объявляются всегда, кроме случая, когда пользователь сам написал свой КК/ОП. Неявно объявленный КК/ОП неявно определяется при попытке явно или неявно вызвать его(КК/ОП). Неявное определение КК выглядит как
Код

inline A::A(const A &rhs) throw(/* тут зависит от спецификаций соответствующих КК, которые будут вызваны этим КК */)
    : Base1(rhs), Base2(rhs), ... , member1(rhs.member1), member2(rhs.member2), ...
{ }

Если такое определение по тем или иным причинам некорректно, то программа некорректна.
ОП выглядит так:
Код

A &operator =(const A &rhs) throw( /* ----||---- */ )
{
    Base1::operator=(rhs);
    ...
    member1 = rhs.member1;
    ...
}


Соответственно, в случае члена-ссылки, ОП будет некорректен и при любой попытке его использовать получишь еггог.

Если хочешь более подробно, то читай соответствующий раздел Стандарта(там целый подпункт "special member functions").

Автор: crazy_hand 22.12.2007, 00:21
archimed7592
Цитата
причём тут виртуальные ф-ции? 0_о

В первом посте: 
Код
virtual void refresh(bool bExtended) const = 0;


Цитата
кроме случая, когда пользователь сам написал свой КК/ОП

-Ну это само собой.

Цитата
ОП выглядит так:


Это всё очевидно для меня. Не понял вообще к чему ты это всё писал?!

Вот только у меня вопрос: в чем логика того, что неявный ОП не работает с элементами ссылками?

Автор: Alek86 22.12.2007, 11:29
Цитата(crazy_hand @  22.12.2007,  00:21 Найти цитируемый пост)
В первом посте: 

хорошо заметил smile
но все равно, там же чуть ниже
Код
class TextView : public View
{
public:
    TextView(Document& doc)
        : View(doc)
    {}

    virtual void refresh(bool bExtended) const
    {
        std::cout << "TextView: " << m_document.getText() << std::endl;
    }
};

так что вопрос оставался бы в силе. если б на него не ответили



Цитата(crazy_hand @  22.12.2007,  00:21 Найти цитируемый пост)
 в чем логика того, что неявный ОП не работает с элементами ссылками?

в том, что ссылку невозможно переназначить

Добавлено @ 11:30
Цитата(crazy_hand @  22.12.2007,  00:21 Найти цитируемый пост)
Это всё очевидно для меня. Не понял вообще к чему ты это всё писал?!

вопрос-то я задавал smile

Автор: archimed7592 22.12.2007, 11:34
Цитата(crazy_hand @  22.12.2007,  00:21 Найти цитируемый пост)
Это всё очевидно для меня.

Цитата(crazy_hand @  22.12.2007,  00:21 Найти цитируемый пост)
Вот только у меня вопрос: в чем логика того, что неявный ОП не работает с элементами ссылками?

Что-то не похоже, что для это всё для тебя очевидно... ну да ладно smile.

Цитата(crazy_hand @  22.12.2007,  00:21 Найти цитируемый пост)
Не понял вообще к чему ты это всё писал?!

Писал я это Алеку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)