Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2008, 21:50   #21
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Код:
ClassOne *Two;
ClassTwo lala;    // Создание объекта класса ClassTwo, посредством вызова конструктора по умолчанию
Two=&lala;  // присваивание указателю адреса созданного объекта
Способ опасен для использования в подпрограммах, т.к. при выходе из подпрограммы объект lala уничтожится и указатель Two (если он используется вне подпрограммы) будет указывать на несуществующий объект.

Код:
ClassOne *Two = new ClassTwo; // Создание объекта класса ClassTwo, посредством вызова конструктора по умолчанию и запись его адреса в переменную Two
Тут нужно не забывать вызывать delete для освобождения памяти, когда объект станет не нужен.

Вот примерно как-то так будет, но зависит от компилятора, что-то возможно оптимизируется и операции будут несколько иные.
pu4koff вне форума Ответить с цитированием
Старый 27.09.2008, 22:06   #22
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Код:
ClassOne *Two = new ClassTwo;
получается указатель *Two это объект какого класса? ClassOne или ClassTwo?
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 22:07   #23
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
Код:
ClassOne *Two = new ClassTwo;
получается указатель *Two это объект какого класса? ClassOne или ClassTwo?
указатель на объект класса ClassTwo
pu4koff вне форума Ответить с цитированием
Старый 27.09.2008, 22:11   #24
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
указатель на объект класса ClassTwo
Но ведь он предписан классу ClassOne:
Код:
ClassOne *Two = new ClassTwo;
как так? Что же он получается сразу к двум классам предписан?
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 22:20   #25
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Код:
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
//////////////////////////////////////////////////////
class Publication
{
   protected:
      string str;
      float price;
   public:
      virtual void getData()
      {
         cout << "\nVvedite nazvanie knigi: ";
         cin >> str;
         cout << "\nVvedite ceny knigi: ";
         cin >> price;
      }
      virtual void putData()
      {
         cout <<setw(35)<<"\nNazvanie knigi: " << str;
         cout << setw(35)<<"\nCena knigi: " << price;
      }
};
//////////////////////////////////////////////////////////////////////
class Book : public Publication
{
   protected:
      int pages;
   public:
      void getData()
      {
         Publication::getData();
         cout << "\nVvedite koli4estvo stanic v knige: ";
         cin >> pages;
      }
      void putData()
      {
         Publication::putData();
         cout <<setw(35)<<"\nKoli4estvo stranic v knige: " << pages;
      }
};
//////////////////////////////////////////////////////////////////////
class Tape : public Publication
{
   protected:
      int duration;
   public:
      void getData()
      {
         Publication::getData();
         cout << "\nVvedite koli4estvo minut v audioknige: ";
         cin >> duration;
      }
      void putData()
      {
         Publication::putData();
         cout <<setw(35)<<"\nKoli4estvo minut v audioknige: " << duration;
      }
};
////////////////////////////////////////////////////////////////////////
int main()
{
   Publication* p[100];
   int n=0;
   char ch;
   do
   {
      cout << "\nVvedite tip vvodimoi zapisi(b/t): ";
      cin >> ch;
      if (ch=='b')
      {
         p[n]=new Book;
      }
      else if (ch=='t')
      {
         p[n]=new Tape;
      }

      p[n++]->getData();
      cout << "Welaete prodolwit' vvod(y/n)? ";
      cin >> ch;
   }while(ch=='y');
   for (int i=0;i<n;i++)
   {
      p[i]->putData();
   }
   return 0;
}
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 27.09.2008 в 22:29.
alexinspir вне форума Ответить с цитированием
Старый 27.09.2008, 22:23   #26
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

может так понятнее будет:
ЖИВОТНОЕ *животное1 = new СОБАКА();
ЖИВОТНОЕ *животное2 = new КОШКА();

надеюсь для Вас нет ничего странного, что мы "назвали" собаку и кошку животными?
pu4koff вне форума Ответить с цитированием
Старый 27.09.2008, 22:28   #27
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
может так понятнее будет:
ЖИВОТНОЕ *животное1 = new СОБАКА();
ЖИВОТНОЕ *животное2 = new КОШКА();

надеюсь для Вас нет ничего странного, что мы "назвали" собаку и кошку животными?
кстати да, так для новайсов будет понятнее.

на практике показано в листинге что я отправил выше. (задача 1 из главы 11 учебника лафоре.)
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 27.09.2008, 22:51   #28
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

ОК пусть будет с животными, тогда так:
Код:
#include <iostream.h>

class Pet {
public:
virtual void feed(){cout << "Feeding with meat and fish..." << endl;};
};

class Cat : public Pet {
public:
void feed(){cout << "Feeding with fish..." << endl;};
};

class Dog : public Pet {
public:
void feed(){cout << "Feeding with meat..." << endl;};
};

void main(){
Pet *Pet[3];
Pet[1] = new Cat;
Pet[2] = new Dog;

Pet[1]->feed();
Pet[2]->feed();
}
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 22:57   #29
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

ну вродь как да.

вопрос считаю исчерпаным.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 27.09.2008, 23:01   #30
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Народ, помогите..
Прочитал кучу уроков, всеравно не понимаю.
Код:
Pet *myPet = new Cat;
1) Создается ссылка класса Pet, указывающая вникуда.
2) Создается стек, в котором выделяется место под объект класса Cat.
3) Ссылка получает адресс этого стека
Бред получается в итоге, ссылка типа Pet указывает на область, предназначенную для Cat, но тем не менее это еще и объект класса Pet, как так?
Как получается, что myPet это одновременно объект класса Pet и Cat?

Последний раз редактировалось Scratch; 28.09.2008 в 00:20.
Scratch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
П Р О С Т Е Й Ш И Й пример 3D aesoem Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 16.07.2008 16:54
Пример из учебника valerij Microsoft Office Excel 11 20.06.2008 15:43
Пример патчинга Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 17.02.2008 19:27
пример парсинга Stanislav Общие вопросы Delphi 4 14.01.2008 03:48