Ошибка при компиляции
От: Аноним  
Дата: 03.03.05 15:58
Оценка:
Имеется вот такой кусок кода :
 class Ml
{
};

 class X
{
   public: void Eat( Ml m );
};

class Antilopa : Ml
{
};

class Lion : X
{
  public:
   void Eat( Ml ml )
  {
    printf("Lion eat antilopa" );
  }
};

 class Continent
{
   public: X  x();
          Ml ml();
};

class Africa : Continent
{
  public:
   Ml ml()
  {
    Antilopa() ant = new Antilopa(); // в этой строке ошибка компиляции
  }
  X x()
  {
  }
};

Не получается создать обьект Antilopa
Компилятор выдает :
conversion from 'Antilopa*' to non-scalar type 'Antilopa' requested
Re: Ошибка при компиляции
От: Leshi Россия  
Дата: 03.03.05 16:03
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>    Antilopa() ant = new Antilopa(); // в этой строке ошибка компиляции
    Antilopa ant = new Antilopa(); // А так?
А>
... << RSDN@Home 1.1.3 stable >>
Re[2]: Ошибка при компиляции
От: Leshi Россия  
Дата: 03.03.05 16:04
Оценка:
Здравствуйте, Leshi, Вы писали:
Вот блин..
А>>
А>>    Antilopa() ant = new Antilopa(); // в этой строке ошибка компиляции
L>    Antilopa *ant = new Antilopa(); // А так?
А>>
... << RSDN@Home 1.1.3 stable >>
Re[3]: Ошибка при компиляции
От: Аноним  
Дата: 03.03.05 16:09
Оценка:
Спасибо — gjvjukj :
Antilopa *ant = new Antilopa();
Re[4]: Ошибка при компиляции
От: Аноним  
Дата: 03.03.05 16:50
Оценка:
Теперь получилось почти все .
не получается создать последний обьект :
 class Ml
{
};

 class X
{
   public: void Eat( Ml m );
};

class Antilopa : Ml
{
};

class Lion : X
{
  public:
   void Eat( Ml ml )
  {
    printf("Lion eat antilopa" );
  }
};
class Bizon : Ml
{
};

class Wolf : X
{
  public:
   void Eat( Ml ml )
  {
    printf("Wolf eat bizon" );
  }
};

 class Continent
{
   public: X   create_x();
           Ml  create_ml();
};

class Africa : public Continent
{
  public:
   Ml create_ml()
  {
    Antilopa *ant = new Antilopa();
  }
  X create_x()
  {
    Lion *ln = new Lion();
  }
};

class America : public Continent
{
  public:
   Ml ml()
  {
    Bizon *ant = new Bizon();
  }
  X x()
  {
    Wolf *ln = new Wolf();
  }
};

class AnimalWorld
{
  private : Ml ml;
  private : X x;

  public:
   AnimalWorld( Continent continent )
  {
    x  = continent.create_x();
    ml = continent.create_ml();
  }

  public:
   void RunFoodChain()
  {
    x.Eat( ml );
  }
};


int main()
{

  Continent *africa = new Africa();
  AnimalWorld *world = new AnimalWorld( *africa ); // вот тут ошибка компиляции

  return 0 ;
}

Ошибка такая :
In function 'AnimalWorld::AnimalWorld[in-charge](Continent)':undefined reference to 'Continent::create_ml()'
Re[5]: Ошибка при компиляции
От: Аноним  
Дата: 03.03.05 18:07
Оценка:
В следующей версии не компилится одна строка :

#include <stdio.h>
#include <stdlib.h>

 class Ml
{
};

 class X
{
   public:
     void Eat( Ml ml );
};

class Antilopa : public Ml
{
};

class Lion : public X
{
  public:
   void Eat( Ml ml )
  {
    printf("Lion eat antilopa" );
  }
};
class Bizon : public Ml
{
};

class Wolf : public X
{
  public:
   void Eat( Ml ml )
  {
    printf("Wolf eat bizon" );
  }
};

 class Continent
{
   public:
           X   create_x;
           Ml  create_ml;
};

class Africa : public Continent
{
  public:
   Ml create_ml()
  {
    Antilopa *ant = new Antilopa();
    return *ant;
  }
  X create_x()
  {
    Lion *ln = new Lion();
    return *ln;
  }
};

class America : public Continent
{
  public:
   Ml ml()
  {
    Bizon *bz = new Bizon();
    return *bz;
  }
  X x()
  {
    Wolf *wl = new Wolf();
    return *wl;
  }
};

class AnimalWorld
{
  private : Ml ml;
  private : X x;

  public:
   AnimalWorld( Continent continent )
  {
    x  = continent.create_x;
    ml = continent.create_ml;
  }

  public:
   void RunFoodChain()
  {
    x.Eat(ml);// вот тут ошибка компиляции
  }
};


int main()
{

  Continent *africa  = new Africa();
  AnimalWorld *world = new AnimalWorld( *africa );
  world->RunFoodChain();

  return 0 ;
}

Компилятор пишет : // undefined reference to 'X::Eat(ml)'
Re[6]: Ошибка при компиляции
От: kfx Латвия  
Дата: 03.03.05 19:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В следующей версии не компилится одна строка :


Нет, ну я понимаю, начинающий есть начинающий, но такой код..
Это тебе не Ява! И вместо void Eat( Ml ml ) надо писать
void Eat( Ml * ml ) или, лучше — void Eat( const Ml & ml ). И так везде.
Иначе будут сделана копия объекта (расходится накладные ресурсы),
или точнее копия доли объекта — что ещо хуже, потому что информация (например, таблица виртуальных функций) об объекте будут потеряна.
В общем, будет плохо!

А ошибка компиляции — потому что нет ключегого слова virtual.

#include <stdio.h>
#include <stdlib.h>

class Ml
{
};

class X
{
public:
    virtual void Eat( const Ml & ml ) = 0;
};

class Antilopa : public Ml
{
};

class Lion : public X
{
public:
    void Eat( const Ml & ml )
    {
       // Внимание! Мы здесь незнаем тип объекта - антилопа ли это?
       printf("Lion eat something" );
    }
};

class Bizon : public Ml
{
};

class Wolf : public X
{
public:
    void Eat( const Ml & ml )
    {
        printf("Wolf eat bizon" );
    }
};

class Continent
{
public:
    virtual X  *  create_x()  const = 0;
    virtual Ml *  create_ml() const = 0;
};

class Africa : public Continent
{
public:
    Ml * create_ml() const 
    {
        return new Antilopa();
    }
    X * create_x() const 
    {
        return new Lion();
    }
};

class America : public Continent
{
public:
   Ml * ml() const 
   {
      return new Bizon();
   }
   X * x() const 
   {
      return new Wolf();
  }
};

class AnimalWorld
{
private : Ml & ml;
private : X & x;

public:
    AnimalWorld( const Continent & continent ) :
       x (*continent.create_x()), 
       ml (*continent.create_ml())
    {
    }

public:
    void RunFoodChain()
    {
       x.Eat(ml);
    }
};


int main()
{

  Continent *africa  = new Africa();
  AnimalWorld *world = new AnimalWorld( *africa );
  world->RunFoodChain();

  return 0 ;
}
Re[7]: Ошибка при компиляции
От: Аноним  
Дата: 04.03.05 06:33
Оценка:
Дык это не я придумал — это один из паттернов проектирования —
Abstract Factory называется
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.