Здравствуйте.
Получили такое вот задание, немного не привычное - не напписать простенькую программу или типо того, а найти "проблемы" в данном програмном коде. Как я понимаю, нужно посмотреть на код и выявить как ошибки так и не достатки видные с полета профессионального или опытного программиста. Простите, но я кроме парочки претензий к конструкторам да и то не сильно обоснвоанных ничего не увидел. прошу помочь, нужно срочно.#include<iostream>
class Foo
{
public:
Foo(int j) { i=new int[j]; s = j}
~Foo() { delete i; }
private:
int* i;
int s;
};
class Bar: Foo
{
public:
Bar(int j) { i=new char[j]; }
operator>> (Bar b) { for (int k = 0; k < s; k++) { cout << b.i[k] << " "; } }
~Bar() { delete i; }
private:
char* i;
};
int main()
{
int i;
cin>>i;
for(int j=100;j<-100;j--);
{
if(j%3=0)
i+=i++ + ++i;
}
Foo* f=new Foo(i);
Foo* b=new Bar(j);
*f=*b;
delete f;
delete b;
}
По Стандарту этот код вообще не будет компилироваться:
1) operator >> это функция, и надо указывать ее тип, у тебя этого не сделано (кстати, перегрузка операции ввода для класса, описанная в самом классе, да еще и в которой производится вывод элементов - это очень "сильный" ход...);
2) при инициализации наследника не производится инициализация предка (у предка нет конструктора без параметров)
"Пустые" (ничего не выполняющие) циклы, проблемы с уровнями доступа - обращение к частным членам предка в потомке. У тебя, кстати, вообще не общее, а частное наследование:
class Bar: Foo {
class Bar: private Foo {
Нет, нет, боюсь вы не совсем правильно меня поняли. Дело в том, что это не моя программа, которую мне сказали исправить. Это такое задание конкретное и предложенное преподавателем - попункто выписать очевидные, и не очень недостатки и недочеты. Т.е. не могли бы Вы как раз вот подобные замечания, но на более доступном уровне. Заранее благодарю...
Я же говорю:
1) при инициализации Bar сначала должна производиться инициализация Foo, как родительского типа. Явно (ну, к примеру, так:
...) этого не делается, компилятор попытается инициализировать Foo самостоятельно, но вот незадача: у Foo есть 2 конструктора (один описан тобой, второй - неявно созданный компилятором Foo(const Foo &)), и ни один из них не является конструктором без параметров (или хотя бы с параметром по-умолчанию, чтобы его можно было вызвать так: Foo()). В таком случае компилятор просто не знает, что делать.
Bar(int j): Foo(j) { ... }
...
cout << *b;ты не сможешь. Вот так будет лучше:
class Bar: Foo
{
...
friend ostream& operator << (ostream &os, const Bar &b) {
// для того чтобы обращаться здесь к s, ее в базовом классе надо сделать
// не частной (private), а защищенной (protected)
for (int k = 0; k < b.s; k++) {
os << b.i[k] << " ";
}
return os;
}
...
for(int j=100;j<-100;--j);Что здесь делает точка с запятой? Определяет, что есть пустое тело цикла. То есть, никаких полезных действий не будет предпринято. Опять же, переменная j существует только внутри цикла, поэтому в строке
if(j%3=0)она будет просто недоступна (по крайней мере должна быть, на современном компиляторе). Еще один подвох в этой строке - использование одного знака '=' вместо удвоенного, что порождает еще одну ошибку: нельзя присваивать ничего выражению, его можно только с чем-то сравнивать...
i+=i++ + ++i;тоже некорректна, почему - читай здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=19365&view=findpost&p=108835
Foo* b=new Bar(j);. Почему - я тебе уже сказал в предыдущем посте: наследование Bar от Foo - частное, поэтому общие (и защищенные тоже) члены частного базового класса становятся в производном классе частными, следовательно приведенная мной строчка некорректна, чтобы это заработало надо сделать общее наследование:
class Bar: public Foo {
...