Имеется вот такой кусок кода :
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
Здравствуйте, <Аноним>, Вы писали:
А>А> Antilopa() ant = new Antilopa(); // в этой строке ошибка компиляции
Antilopa ant = new Antilopa(); // А так?
А>
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, Leshi, Вы писали:
Вот блин..
А>>А>> Antilopa() ant = new Antilopa(); // в этой строке ошибка компиляции
L> Antilopa *ant = new Antilopa(); // А так?
А>>
... << RSDN@Home 1.1.3 stable >>
Теперь получилось почти все .
не получается создать последний обьект :
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()'
В следующей версии не компилится одна строка :
#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)'
Здравствуйте, Аноним, Вы писали:
А>В следующей версии не компилится одна строка :
Нет, ну я понимаю, начинающий есть начинающий, но такой код..
Это тебе не Ява! И вместо 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 ;
}