Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Если одно из полей класса - ссылка... 
V
    Опции темы
Alek86
Дата 21.12.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



скрпировал с прошлой своей темы, так как этот вопрос к ней не относится

тут встретился такой класс

Код

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;       // ???

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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
srd
Дата 21.12.2007, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Alek86
Дата 21.12.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Код

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;

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

Это сообщение отредактировал(а) Alek86 - 21.12.2007, 20:50


--------------------
user posted image    user posted image
PM MAIL   Вверх
srd
Дата 21.12.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
crazy_hand
Дата 21.12.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.12.2007
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Может я чего-то не понимаю, но:

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

Поправьте, если я не прав.
PM MAIL ICQ   Вверх
archimed7592
Дата 21.12.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



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").


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
crazy_hand
Дата 22.12.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 12.12.2007
Где: Санкт-Петербург

Репутация: нет
Всего: нет



archimed7592
Цитата
причём тут виртуальные ф-ции? 0_о

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


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

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

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


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

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

PM MAIL ICQ   Вверх
Alek86
Дата 22.12.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(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

Это сообщение отредактировал(а) Alek86 - 22.12.2007, 11:31


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 22.12.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



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

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

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

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

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1225 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.