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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2008, 00:52   #31
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

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

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

надеюсь для Вас нет ничего странного, что мы "назвали" собаку и кошку животными?
Цитата:
Сообщение от Scratch Посмотреть сообщение
1) Создается ссылка класса Pet, указывающая вникуда.
не в никуда, а на экземпляр подкласса Cat, данные в который записал конструктор(по умолчанию/без_аргументов).

-------------------------------------------------------------

есть кошка, ее зовут мурка.
мурка - это кошка
но мурка она еще и кощачья и млекопитающая и животное.

ну че тут непонятного... (или я дибил... или...)
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 28.09.2008 в 01:18.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 12:34   #32
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
писец... тебе же на пальцах показали...





не в никуда, а на экземпляр подкласса Cat, данные в который записал конструктор(по умолчанию/без_аргументов).

-------------------------------------------------------------

есть кошка, ее зовут мурка.
мурка - это кошка
но мурка она еще и кощачья и млекопитающая и животное.

ну че тут непонятного... (или я дибил... или...)
Причем тут кошки и собаки? Что происходит с памятью во время этой операции?
Почему с классами работает, а например, так нет?
int *tata = new float;

Последний раз редактировалось Scratch; 28.09.2008 в 12:44.
Scratch вне форума Ответить с цитированием
Старый 28.09.2008, 13:19   #33
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
Причем тут кошки и собаки? Что происходит с памятью во время этой операции?
Почему с классами работает, а например, так нет?
int *tata = new float;
мля, слов нет... ты биологию учил?

Код:
int *tata = new float;
тоже самое что и:
Код:
ЖИВОТНОЕ* кошка1 = new МУХОМОР;
(вот скажи, на кой йух ты причисляешь грибы к животным, и спрашиваешь почему твоя классификация не работает?)

p/s/ чето мне кажется что ты ботан... самый настоящий... никакой логики >_<
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 28.09.2008 в 13:23.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 14:20   #34
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
Причем тут кошки и собаки?
Притом, что нужно логику развивать. Если сказать человеку, что он работает, спустя рукава, то он поймёт (если достаточно образован), что ему хотели сказать, даже если на нём безрукавка.
Цитата:
Сообщение от Scratch Посмотреть сообщение
Что происходит с памятью во время этой операции?
С памятью во время операции происходит:
- Выделяется память под объект класса
- Вызывается конструктор для этого объекта
- в указатель записывается адрес созданного объекта
Цитата:
Сообщение от Scratch Посмотреть сообщение
Почему с классами работает, а например, так нет?
int *tata = new float;
Потому что float и int не имеют ничего общего. Это типы, а не классы. Или у Вас float унаследован он int?
pu4koff вне форума Ответить с цитированием
Старый 28.09.2008, 16:13   #35
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

ОК, давайте тогда попробуем разобрать все по порядку), у меня есть код:

Код:
class Pet {
    public:
    virtual void feed(){cout << "Feeding with anything..." << endl;};
};

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

void main(){
    Pet *myPet = new Cat;
    myPet->feed();
}
При объявлении Pet *myPet = new Cat; компилятор создает ссылку на структуру:
Код:
struct Cat{
virtual void feed(){cout << "Feeding with anything..." << endl;}; //принадлежит классу Pet
void feed(){cout << "Feeding with fish..." << endl;}; //принадлежит классу Cat
}
Затем, когда я вызываю myPet->feed(); он проходит по этой структуре и вызывает feed() того класса, которому принадлежит структура, в нашем случае это struct Cat{
Все верно?
Scratch вне форума Ответить с цитированием
Старый 28.09.2008, 16:16   #36
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
ОК, давайте тогда попробуем разобрать все по порядку), у меня есть код:

Код:
class Pet {
    public:
    virtual void feed(){cout << "Feeding with anything..." << endl;};
};

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

void main(){
    Pet *myPet = new Cat;
    myPet->feed();
}
При объявлении Pet *myPet = new Cat; компилятор создает ссылку на структуру
тяжелый случай...

Код:
class Pet {
    public:
    virtual void feed(){cout << "Feeding with anything..." << endl;};
};

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

void main(){
    Pet *myPet = new Cat;
    myPet->feed();
}
ты где структуру углядел?
---------------------------------------------------------


Код:
struct Cat{
virtual void feed(){cout << "Feeding with anything..." << endl;}; //принадлежит классу Pet
void feed(){cout << "Feeding with fish..." << endl;}; //принадлежит классу Cat
}
очень тяжелый случай...







аффтор, забей на программирование, и ваще на все науки/области где нужна логика...
твои науки/области - гуманитарные.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

Последний раз редактировалось alexinspir; 28.09.2008 в 16:20.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 16:24   #37
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
тяжелый случай...

Код:
class Pet {
    public:
    virtual void feed(){cout << "Feeding with anything..." << endl;};
};

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

void main(){
    Pet *myPet = new Cat;
    myPet->feed();
}
ты где структуру углядел?
---------------------------------------------------------


Код:
struct Cat{
virtual void feed(){cout << "Feeding with anything..." << endl;}; //принадлежит классу Pet
void feed(){cout << "Feeding with fish..." << endl;}; //принадлежит классу Cat
}
очень тяжелый случай...







аффтор, забей на программирование, и ваще на все науки/области где нужна логика...
твои науки/области - гуманитарные.

http://www.devdoc.ru/index.php/conte...rtual_base.htm
Почитай, потом говори...

Цитата:
Компилятор автоматически выполняет преобразование типа. Вот как это делается. В псевдокоде класс D выглядит так:

struct D
{
int a1;
int a2;
int a3;
int b1;
int b2;
int b3;
int d1;
int d2;
int d3;
};

Последний раз редактировалось Scratch; 28.09.2008 в 16:26.
Scratch вне форума Ответить с цитированием
Старый 28.09.2008, 16:36   #38
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
http://www.devdoc.ru/index.php/conte...rtual_base.htm
Почитай, потом говори...
купи хорошую книгу. одну.
и учи по ней, а не лазь по инету и не читай с разных источников.
закончишь с одной книгой, бери другую и так далее.

там написано все коректно, и я сказал тоже самое что написано там.

а)компилятор не может сделать структуру, потому что структура не может содержать методы, а твой класс Cat содержит метод feed().

б)структура не может содержать методы, а твоя структура Cat содержит метод feed().

(я также начинал со многих книг, но знакомый человек, посоветовал мне учить только по одной книге, забивая на все остальные(за исключением справочников)).
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 16:45   #39
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

это я когда-то пытался написать калькулятор, основанный на массиве указателей. (пытался усовершенствовать калькулятор основанный на стеке).
гдето у меня возникла семантическая ошибка, пытался ее отследить, после пары часов задолбался и забросил это дело.
прога работает, но не так как надо, но зависимость меж классами, и виртуальные функции проследить можно:
Код:
#include <iostream>
#include <cstring>
using namespace std;
const int LEN=120;
const int MAX=40;
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
float atold(char st[])
{
   int lent=strlen(st);
   float temp=0;
   float templ=0;
   int i=0;
   do
   {
      temp=temp*10+(st[i++]-'0');
   }while(st[i]>='0' && st[i]<='9');
   int k=0;
   if(st[i]=='.')
   {
      ++i;
      do
      {
         templ=templ*10+(st[i++]-'0');
         ++k;
      }while( st[i]>='0' && st[i]<='9' && i<lent);
   }
   if (k!=0)
   {
      for(int m=0;m<k;m++)
      {
         templ/=10;
      }
   }
   temp+=templ;
   return temp;
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
class Token
{
   public:
      static int top;
      Token()
      {}
      virtual ~Token()
      {
         delete this;
      }
      virtual float getNumber()=0;
      virtual void putNumber(float var)=0;
      virtual char getOperator()=0;
      virtual void putOperator(char var)=0;
      virtual int getTop()=0;
};
int Token::top=0;
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
class Operator: public Token
{
   protected:
      char st[MAX];
   public:
      ~Operator()
      {
         delete this;
      }
      void putNumber(float var)
      {}
      void putOperator(char var)
      {
         st[++(Token::top)]=var;
      }
      float getNumber()
      {}
      char getOperator()
      {
         return st[--Token::top];
      }
      int getTop()
      {
         return Token::top;
      }
};
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
class Number: public Token
{
   protected:
      float nm[MAX];
   public:
      ~Number()
      {
         delete this;
      }
      void putOperator(char var)
      {}
      void putNumber(float var)
      {
         nm[(Token::top)++]=var;
      }
      char getOperator()
      {}
      float getNumber()
      {
         return nm[--Token::top];
      }
      int getTop()
      {
         return Token::top;
      }
};
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 28.09.2008, 16:45   #40
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Код:
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
class Express
{
   protected:
      Token* s[MAX];
      char* pStr;
      int len1;
   public:
      Express(char* ptr)
      {
         pStr=ptr;
         len1=strlen(pStr);
      }
      //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
      void parse()
      {
         char ch;
         char ar[10];
         float lastval;
         char lastop;
         s[0]=new Number;
         s[1]=new Operator;
         s[2]=new Number;
         s[3]=new Operator;
         s[4]=new Number;
         cout << "len1: " << len1;
         for(int j=0;j<len1-1;j++)
         {
            cout << endl << j << " -cikl for";
            ch=pStr[j];
            cout << endl << ch << "ch";
            if(ch>='0' && ch<='9')
            {
               int t1=0;
               do
               {
                  ar[t1++]=pStr[j++];
                  ch=pStr[j];
               }while( ch>='0' && ch<='9');
               if(ch=='.')
               {
                  do
                  {
                     ar[t1++]=pStr[++j];
                  }while( pStr[j+1]>='0' && pStr[j+1]<='9');
               }
               
               ar[t1]='\0';
               cout << endl << j<< " -cikl do";
               cout << endl << atold(ar);
               s[Token::top]->putNumber(atold(ar));
            }
            else if (ch=='+' || ch=='-' || ch=='*' || ch=='/')
            {
               if(s[Token::top]->getTop()==1)
               {
                  
                  s[Token::top]->putOperator(ch);
               }
               else
               {
                  lastval=s[Token::top]->getNumber();
                  lastop=s[Token::top]->getOperator();
                  if((ch=='*' || ch=='/')&&(lastop=='+' ||lastop=='-'))
                  {
                     s[Token::top]->putOperator(lastop);
                     s[Token::top]->putNumber(lastval);
                  }
                  else
                  {
                     switch(lastop)
                     {
                        case '+':
                           s[Token::top]->putNumber(s[Token::top]->getNumber()+lastval);
                           break;
                        case '-':
                           s[Token::top]->putNumber(s[Token::top]->getNumber()-lastval);
                           break;
                        case '*':
                           s[Token::top]->putNumber(s[Token::top]->getNumber()*lastval);
                           break;
                        case '/':
                           s[Token::top]->putNumber(s[Token::top]->getNumber()/lastval);
                           break;
                        default: 
                           cout << "\nNeizvestniy operator!(1)";
                           exit(1);
                     }
                  }
                  s[Token::top]->putOperator(ch);
               }
            }
            else
            {
               cout << "\nNeizvestniy simvol!(2)";
               exit(1);
            }
         }
      }
      //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
      float solve()
      {
         float lastval;
         while(s[Token::top]->getTop()>1)
         {
            lastval=s[Token::top]->getNumber();
            switch(s[Token::top]->getOperator())
            {
               case '+':
                  s[Token::top]->putNumber(s[Token::top]->getNumber()+lastval);
                  break;
               case '-':
                  s[Token::top]->putNumber(s[Token::top]->getNumber()-lastval);
                  break;
               case '*':
                  s[Token::top]->putNumber(s[Token::top]->getNumber()*lastval);
                  break;
               case '/':
                  s[Token::top]->putNumber(s[Token::top]->getNumber()/lastval);
                  break;
               default:
                  cout << "Neizvestniy operator!(1)";
                  exit(1);
            }
         }
         return s[Token::top]->getNumber();
      }
};
//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
int main()
{
   char ans;
   char string[LEN];
   cout << "\nVvedite arifmeti4eskoe virawenie";
   do
   {
      cout << "\nVirawenie\n:->";
      cin >> string;
      Express* eptr = new Express(string);
      eptr->parse();
      cout << "\nRezyltat: " << eptr->solve();
      delete eptr;
      cout << "\nEwe odno virawenie(y/n)?";
      cin >> ans;
   }while(ans=='y');
   return 0;
}
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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