Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Поиск ошибки


Автор: stat007 10.12.2008, 18:54
Программа чёта выдаёт ошибку в строке *, подскажите почему:

Код

#include<iostream>
using namespace std; 
class myclass 
{
    int x;
public:
    myclass() { x = 0;}
    myclass(int n) { x = n; }
    int getx() { return x; }
    void setx(int n) { x = n; }
};
int main() 
{
    myclass *p; 
    myclass ob[10];
    p=new myclass[10];
    if(!p)
    {
        cout<<"Error mamory!"<<endl;
        return 1;
    }
    int i;
    for(i=0; i<10; i++)
        p[i]=ob;             //(*)
    for(i=0; i<10; i++)
    {
        cout<<"p["<<i<<"]: "<<p[i].getx();
        cout<<endl;
    }
    return 0; 
}

Автор: Fazil6 10.12.2008, 19:02
Цитата(stat007 @  10.12.2008,  18:54 Найти цитируемый пост)
подскажите почему

потому что p[i] это совсем не obи присваивать так нельзя

Автор: Acer 10.12.2008, 19:04
*тут я был не прав*

Автор: Kallikanzarid 10.12.2008, 19:05
1) вместо p[i] = ob, очевидно, должно идти p[i] = ob[i]
2) По умолчанию в случае нехватки памяти new не возвращает NULL, а поднимает исключение std::bad_alloc. Поэтому либо лови исключение, либо используй p = new<nothrow> myclass[10] - эта версия new как раз возвращает NULL при неудаче.
3) В твоем классе нет оператора присваивания, аксессор не помечен как const, конструктор с одной переменной не помечен как explicit (хотя последнее - не всегда плохо). Также ты не используешь список инициализаторов. Все это делает твой код неэффективным (в теории, конечно, для таких игрушечных классов это не так важно).
4) Еще мелочь - в цикле лучше использовать ++i, а не i++. Для обычных переменных это абсолютно неважно, но лучше привыкай сразу, ибо итераторы STL подобное не прощают.

Добавлено через 1 минуту и 31 секунду
Acer, как бы тебе по-мягче сказать... Ты... эээ... хм... не прав. Да, вот! Ты не прав.

Автор: stat007 10.12.2008, 20:05
ок! спасибо!
а ещё такой вопрос: как инициализировать массив в данной программе, ну что бы выводилось 1 2 3 4 5 и т.д. ??

Автор: Kallikanzarid 10.12.2008, 20:10
p[i] = myclass( i )

или

p[i] = i; // если твой конструктор не помечен как explicit или ты определил оператор присваивания

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)