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

Поиск:

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


Опытный
**


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

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



Собсно вот код

Код

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

class B: public A{
public:
       void f(){}
};

class C{
    A a;
public:
    C(): a( B() ){}
};


До появления виртуальной ф-ции.. работало все как нужно...
Я конечно могу сделать переопределение ф-ции, и тогда опять будет работать все как нужно, но мне бы хотелось не занимать этими ф-циями "лишнюю" память....

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


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


Нереварин
**


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

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



Не понятно, чего хочешь добиться. Класс А является абстрактным, потому класс С не может содержать экземпляров класса А.


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


Опытный
**


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

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



Если сделать так.
Код

class A{
public:
      void f(){}
};
class B: public A{
public:
       void f(){ShowMessage("ssssssssssssss");}
};
class C{
    A a;
public:
    C(): a( B() ){a.f();}
};

То конструктор С() Покажет сообщение.
Но A::f() существует, и занимает память...

Мне нужен экземпляр класса B
Но чтобы знал он о методах только класса A.
Цитата

Не понятно, чего хочешь добиться. Класс А является абстрактным, потому класс С не может содержать экземпляров класса А.

По-моему конструктор класса C вполне ясно говорит чего я хочу.

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


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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Там занимать нечему, функции ж не копируються в каждый экземпляр класса.
Цитата(Neitron @ 2.12.2005, 02:31)
Но A::f() существует, и занимает память...

Малость не врубаюсь я, а как ты хочешь проделать эту операцию
Код
 C(): a( B() ){a.f();} 

без A::f? O_O


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Neitron
Дата 2.12.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



chipset
Объясняю f() виртуальная и определянеся ри создании класса, через класс B...
Вообщем я понел, что без указателей это сделать невозможно.А жаль.


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



конструктор-то говорит, но о чем он говорит ты, похоже, не знаеш...
+ класс B и так знает только о методах класса А ( ну и о своих ) -- о методах класса С он не знает ( если ты это имел в виду )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Neitron
Дата 2.12.2005, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(chipset @ 2.12.2005, 12:36)
  Там занимать нечему, функции ж не копируються в каждый экземпляр класса.

Не совсем

Код


class A{
public:
      void f(){}
};
class B: public A{
public:
       void f(){ShowMessage("ssssssssssssss");}
};

После этого существует две ф-ции A::f() и B::f()
При использовании виртуальных ф-ций cуществует только B::f() он обратится можно к ней и из класса A

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


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Цитата
f() виртуальная и определянеся ри создании класса, через класс B...

это и так понятно... а чем тебя это не устраивает/что ты хочеш изменить?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Neitron
Дата 2.12.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я хочу чтобы это работало... Это не компилируется.!
Видимо придется делать так...
Код

class A{
public:
      virtual void f()=0;
};
class B: public A{
public:
       void f(){}
       virtual ~f(){};
};
class C{
    A * a;
public:
    C(): a(new B() ){}
    ~C(){delete a;}
};

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

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


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



если не объявиш а абстрактным -- тоже две функции будут _существовать_...
что тебе нужно так и не понял...
Добавлено @ 12:50
что такое virtual ~f(){}; ?
+ напиши не "хочу чтобы скомпилировалось" а задачу...
++ в чем проблема с "заботой об удалении"?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Neitron
Дата 2.12.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я знаю все о чем говорит конструктор.

Я хочу чтобы "a" знал только о методах A, но был создал при помощи B Без указателей...

Забей на
virtual ~f(){};

Я показал тот код который мне нужен.
В Виде указателей, хочу чтобы это было без указателей.

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


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


Нереварин
**


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

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



Цитата(Neitron @ 2.12.2005, 19:44)
В этом случае придется заботится об удалении объекта... А я это делать не хотел...

Можно и не заботиться...
Код

#include <memory>

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

class B: public A{
public:
       void f(){}
};

class C{
    std::auto_ptr<A> a;    
public:
    C(): a(new B())
        {}
};

Или использовать ссылки


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


Опытный
**


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

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



Цитата(srd @ 2.12.2005, 12:50)
Или использовать ссылки

smile smile smile
Только я это уже сам понел=))))
Пока я тут спорил, мне пришла в голову мысль о ссылка и уже минут 10 у меня компилируется проект и я ждал выдаст он ошибку или нет...
Код

class A{
public:
      virtual void f()=0;
};
class B: public A{
public:
       void f(){ShowMessage("ssssssssssssss");}
};
class C{
    A &a;
public:
    C(): a( B() ){a.f();}
};

Всем спасибо. Как всегда никто не помог вовремя...

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


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


Нереварин
**


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

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



Это у тебя фигня получилась. Неконстантные ссылки на временный объекты создавать нельзя.


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


Опытный
**


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

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



Почему временный?
Объект существует пока существует класс или я не прав?
Не проблема сделать её константной...


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


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

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