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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли осуществить подобное без указателей. 
:(
    Опции темы
srd
Дата 2.12.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Здесь B() создаёт временный объект, которым ты пытаешься проинициализировать неконстантую ссылку, что запрещено.
Код

C() : a(  B()  ) {a.f();}


По идее, надо так:
Код

#include <iostream>

class A{
public:
      virtual void f()const=0;
};

class B: public A{
public:
       void f()const{ std::cout << "test\n";}
};

class C{
    const A& a;
public:
    C(): a(B())
    {
            a.f();
    }
};

int main()
{
    C c;
}

gcc это компилирует, и получаемая программа работает правильно.
А вот VC7.1 скомпилировать такой код не может:
Код

error C2354: 'C::a' : initialization of reference member requires a temporary variable
error C2439: 'C::a' : member could not be initialized






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


Опытный
**


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

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



Когда я делаю так..
Код

class C{
    const A& a;
public:
    C(): a(B())
    {
            a.f();
    }
};

Билдер ругается на то что я вызываю не константные ф-ции...
Может тогда так?
Код

class C{
    A&const a;
public:
    C(): a(B())
    {
            a.f();
    }
};

Ф-ции не могут у меня быть константными.
Что-то ты хитришь, я не понимаю что ужасного в моем коде?
Никаких предупреждений у меня билдер вообще не пишит.
Очень хочу разобраться в этом моменте...

Это сообщение отредактировал(а) Neitron - 2.12.2005, 14:43


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Neitron
Дата 2.12.2005, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может это недостаток компилера от мелкомягких?

Это сообщение отредактировал(а) Neitron - 2.12.2005, 14:56


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Neitron
Дата 2.12.2005, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пришел к выводу, что лучше буду использовать указатели.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Vyacheslav
Дата 2.12.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(srd @ 2.12.2005, 14:29)
Здесь B() создаёт временный объект, которым ты пытаешься проинициализировать неконстантую ссылку, что запрещено.

А чeм тут поможет константная ссылка? В любом случае это ошибка - инициализировать ссылку временным объектом, который к тому моменту, когда им пытаются воспользоваться посредством ссылки уже уничтожен. И сработала или не сработала программа - это не аргумент, по скольку при уничтожении объекта память не обязана быть очищена, то в приниципе код может и сработать на уничтоженном объекте


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
srd
Дата 2.12.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


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

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



Цитата(Vyacheslav @ 3.12.2005, 00:27)
А чeм тут поможет константная ссылка? В любом случае это ошибка - инициализировать ссылку временным объектом, который к тому моменту, когда им пытаются воспользоваться посредством ссылки уже уничтожен. И сработала или не сработала программа - это не аргумент, по скольку при уничтожении объекта память не обязана быть очищена, то в приниципе код может и сработать на уничтоженном объекте

Константная ссылка продлевает время жизни временного объекта. Пока ссылка не выйдет из области видимости, временный объект живёт.



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


Бывалый
*


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

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



Neitron
не пойму, чем ты компилируешь. у меня vc++ выдал сразу две ошибки на строку:

Код

C(): a(B())    {    a.f(); }


error C2354: 'C::a' : initialization of reference member requires a temporary variable

error C2439: 'C::a' : member could not be initialized

что совершенно справедливо: выполнение нестатического метода требует наличие временного (хотя бы) объекта, а ты не можешь его создать, потому что A - класс абстрактный.
Добавлено @ 21:02
упс. пропустил продолжение темы smile.
Добавлено @ 21:04
Цитата(Neitron @ 2.12.2005, 12:50)
Я хочу чтобы "a" знал только о методах A, но был создал при помощи B Без указателей...

рассудим логически. ты хочешь, чтобы a знал только о методах A, но ведь среди методов A есть чисто виртуальные! как ты объяснишь компилятору, что они должны делать?

Это сообщение отредактировал(а) blackofe - 2.12.2005, 21:09
PM MAIL   Вверх
Earnest
Дата 4.12.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(srd @ 2.12.2005, 17:42)
Константная ссылка продлевает время жизни временного объекта. Пока ссылка не выйдет из области видимости, временный объект живёт.


Неконстантный временный объект живет ровно столько же, просто некоторые компиляторы запрещают создание неконстантных временных объектов, справедливо считая это небезопасным.

Во время работы конструктора a показывает на существующий (временный !)объект, и код отработает. Но потом-то а останется в классе! И будет показывать на мусор.
Если нужно, чтобы код отработал только в конструкторе, заведи в нем локальную переменную И и сделай вызов.

Ссылка или указатель должны куда-то указывать - т.е. объект нужно где-то хранить - либо динамическое выделение памяти (с последующим освобождением), либо включить объект B внутрь класса C и присвоить a ссылку на него...



--------------------
...
PM   Вверх
Neitron
Дата 5.12.2005, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

как ты объяснишь компилятору, что они должны делать? 

Я хотел делать это также как мог делать в этом коде...

Код

const A a = B();

Но я уже уловил суть.... То что я хотел, этого видимо не сделать....
Earnest
Я давно сам в этом разобрался.

Это сообщение отредактировал(а) Neitron - 5.12.2005, 11:19


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.4926 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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