о виртуальных функциях
От: new_user  
Дата: 16.02.05 11:55
Оценка:
подскажите почему EAccessViolation возникает ?

class ClassBase
        {
                string filename;
                virtual void vStringProc(string,int)=0;
                public:
                        ClassBase(string);
                        ~ClassBase();
                        void LoadFile();
                        void StringProc(string,int);
        };

class ClassC1:public ClassBase
        {
                int x;
                void vStringProc(string,int);

                public:
                        ClassC1(int,int,string);
                        ~ClassC1();
        };



куски из файлов cpp
void ClassBase::LoadFile()
        {
        ...
                StringProc(str,i);
        }

void ClassBase::StringProc(string str,int i)
        {
                vStringProc(str,i);
        }
///////////////////////////////////////////
void ClassC1::vStringProc(string str,int i)
        {
        ...//Реализация
        }



вызов из главного файла
ClassC1 *cC1=new ClassC1(x,y,"t1.txt");
cC1->LoadFile(); //EAccessViolation на эту строку
Re: о виртуальных функциях
От: Awaken Украина  
Дата: 16.02.05 12:05
Оценка:
_>ClassC1 *cC1=new ClassC1(x,y,"t1.txt");
cC1->>LoadFile(); //EAccessViolation на эту строку
_>[/code]


у тебя происходит косвенный вызов чисто виртуальной функции
Re[2]: о виртуальных функциях
От: new_user  
Дата: 16.02.05 12:08
Оценка:
Здравствуйте, Awaken, Вы писали:

_>>ClassC1 *cC1=new ClassC1(x,y,"t1.txt");

cC1->>>LoadFile(); //EAccessViolation на эту строку
_>>[/code]


A>у тебя происходит косвенный вызов чисто виртуальной функции


а как это побороть ???
Re[2]: о виртуальных функциях
От: Vamp Россия  
Дата: 16.02.05 12:14
Оценка:
A>у тебя происходит косвенный вызов чисто виртуальной функции
Почему?
Да здравствует мыло душистое и веревка пушистая.
Re[3]: о виртуальных функциях
От: Awaken Украина  
Дата: 16.02.05 12:19
Оценка:
Здравствуйте, Vamp, Вы писали:

A>>у тебя происходит косвенный вызов чисто виртуальной функции

V>Почему?

вру , нет поскольку она переопределена в C1
а код в таком виде как он приведен не должен скомпилиться вообще. в ClassBase недефолтный конструктор который
нигде не вызывается
Re[3]: о виртуальных функциях
От: Аноним  
Дата: 16.02.05 12:23
Оценка:
A>>у тебя происходит косвенный вызов чисто виртуальной функции

_>а как это побороть ???


код приведен не полностью и в таком виде не скомпилится
покажи все целиком
Re[4]: о виртуальных функциях
От: Vamp Россия  
Дата: 16.02.05 13:02
Оценка:
A>а код в таком виде как он приведен не должен скомпилиться вообще. в ClassBase недефолтный конструктор который
A>нигде не вызывается
Ну почему же. Мы же не знаем сигнатуры конструктора С1. Вероятно, вызывается из него.
Да здравствует мыло душистое и веревка пушистая.
Re: о виртуальных функциях
От: 1234  
Дата: 16.02.05 13:36
Оценка:
Здравствуйте, new_user, Вы писали:

_>подскажите почему EAccessViolation возникает ?


_>
_>class ClassBase
_>        {
_>                string filename;
_>                virtual void vStringProc(string,int)=0;
_>                public:
_>                        ClassBase(string);
_>                        ~ClassBase();
_>                        void LoadFile();
_>                        void StringProc(string,int);
_>        };

_>class ClassC1:public ClassBase
_>        {
_>                int x;
_>                void vStringProc(string,int);

_>                public:
_>                        ClassC1(int,int,string);
_>                        ~ClassC1();
_>        };

_>



_>куски из файлов cpp

_>
_>void ClassBase::LoadFile()
_>        {
_>        ...
_>                StringProc(str,i);
_>        }

_>void ClassBase::StringProc(string str,int i)
_>        {
_>                vStringProc(str,i);
_>        }
_>///////////////////////////////////////////
_>void ClassC1::vStringProc(string str,int i)
_>        {
_>        ...//Реализация
_>        }
_>



_>вызов из главного файла

_>
_>ClassC1 *cC1=new ClassC1(x,y,"t1.txt");
cC1->>LoadFile(); //EAccessViolation на эту строку
_>


у вас в конструкторе ClassBase делается опосредованный вызов виртуальной функции через StringProc вызывается vStringProc, а она является чисто виртуальной. А, как извесно, при конструировании виртуальности ещё нету.
Т.е. вы не можете вызывать чистовиртуальные функции из конструктора, или функции которые их вызывают.
Re[2]: о виртуальных функциях
От: Lorenzo_LAMAS  
Дата: 16.02.05 13:41
Оценка:
1>у вас в конструкторе ClassBase делается опосредованный вызов виртуальной функции через StringProc вызывается vStringProc, а она является чисто виртуальной. А, как извесно, при конструировании виртуальности ещё нету.
1>Т.е. вы не можете вызывать чистовиртуальные функции из конструктора, или функции которые их вызывают.

А где у него определение конструктора ClassBase?
Of course, the code must be complete enough to compile and link.
Re[3]: о виртуальных функциях
От: Vamp Россия  
Дата: 16.02.05 13:44
Оценка: +1
L_L>А где у него определение конструктора ClassBase?
Ага, мне тоже интересно.
Не говоря уже о том, что при таком опосредованном вызове будет не АссессВиолейшн, а pure virtual function call.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: о виртуальных функциях
От: Lorenzo_LAMAS  
Дата: 16.02.05 13:47
Оценка:
V>Ага, мне тоже интересно.

У меня аж глаза заболели, пока искал определение конструктора в приведенном коде
Of course, the code must be complete enough to compile and link.
Re[3]: о виртуальных функциях
От: 1234  
Дата: 16.02.05 14:52
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

1>>у вас в конструкторе ClassBase делается опосредованный вызов виртуальной функции через StringProc вызывается vStringProc, а она является чисто виртуальной. А, как извесно, при конструировании виртуальности ещё нету.

1>>Т.е. вы не можете вызывать чистовиртуальные функции из конструктора, или функции которые их вызывают.

L_L>А где у него определение конструктора ClassBase?


А, пардон, точно, не туда глянул
Re[4]: о виртуальных функциях
От: new_user  
Дата: 16.02.05 15:47
Оценка:
по совету который дали тут
http://rsdn.ru/Forum/Message.aspx?mid=1023493
выбрал третий вариант (может я не так понял его)


class ClassBase
        {
                string filename;

                virtual void vStringProc(string,int)=0;

                public:
                        ClassBase(string);
                        ~ClassBase();
                        void LoadFile();
                        void StringProc(string,int);
        };

class ClassC1:public ClassBase
        {
                int x;
                int y;
                double data[100][100];
                virtual void vStringProc(string,int);

                public:
                        ClassC1(int,int,string);
                        ~ClassC1();
        };





ClassBase::ClassBase(string fname)
        {
                filename=fname;
        }

ClassBase::~ClassBase()
        {

        }

void ClassBase::LoadFile()
        {
                FILE *stream;
                char buf[255];
                string str;
                int i=0;
                stream=fopen(filename.c_str(),"r");
                while (fgets(buf,255,stream))
                        {
                                str=buf;
                                StringProc(str,i);    //вызов
                                i++;
                        }
                fclose(stream);
        }

void ClassBase::StringProc(string str,int i)
        {
                vStringProc(str,i);
        }


ClassC1::ClassC1(int x,int y, string fname):ClassBase(fname)
        {
                size_x=x;
                size_y=y;
                for (int i=0;i<size_x;i++)
                        for (int j=0;j<size_y;j++)
                                data[i][j]=0;

        }

ClassC1::~ClassC1()
        {
        }

void ClassC1::vStringProc(string str,int i)
        {
                int index_parser;
                int next_parser;
                string item;
                double result;
                index_parser=0;
                for(int j=0;j<size_x;j++)
                        {
                                next_parser=str.find(" ",index_parser);
                                item=str.substr(index_parser,next_parser);
                                result=atof(item.c_str());
                                data[i][j]=result;
                                index_parser=next_parser+1;
                        }
        }
Re[5]: о виртуальных функциях
От: new_user  
Дата: 16.02.05 15:50
Оценка:
упс, попутался

class ClassC1:public ClassBase
        {
                int size_x;
                int size_y;
                double data[100][100];
                virtual void vStringProc(string,int);

                public:
                        ClassC1(int,int,string);
                        ~ClassC1();
        };
Re: о виртуальных функциях
От: Ivn Россия  
Дата: 16.02.05 15:56
Оценка:
Здравствуйте, new_user, Вы писали:

_>подскажите почему EAccessViolation возникает ?


нет кода конструкторов — а так вполне рабочий код...
Re[5]: о виртуальных функциях
От: Awaken Украина  
Дата: 16.02.05 15:58
Оценка:
_> stream=fopen(filename.c_str(),"r");
_> while (fgets(buf,255,stream))


ошибка твоя в том что не проверяешь stream на NULL и Exception вываливается при обращении по нулл пойнтеру внутри fgets

и не причем тут виртуальные функции
Re[6]: о виртуальных функциях
От: new_user  
Дата: 16.02.05 16:15
Оценка:
Здравствуйте, Awaken, Вы писали:

_>> stream=fopen(filename.c_str(),"r");

_>> while (fgets(buf,255,stream))


A>ошибка твоя в том что не проверяешь stream на NULL и Exception вываливается при обращении по нулл пойнтеру внутри fgets


A>и не причем тут виртуальные функции



из MSDNвского примера на fopen NULL вылетает если файл не существует
однако он есть и лежит в той же папке, где и этот cpp
Re[7]: о виртуальных функциях
От: Awaken Украина  
Дата: 16.02.05 16:22
Оценка:
Здравствуйте, new_user, Вы писали:

_>Здравствуйте, Awaken, Вы писали:


_>>> stream=fopen(filename.c_str(),"r");

_>>> while (fgets(buf,255,stream))


A>>ошибка твоя в том что не проверяешь stream на NULL и Exception вываливается при обращении по нулл пойнтеру внутри fgets


A>>и не причем тут виртуальные функции



_>из MSDNвского примера на fopen NULL вылетает если файл не существует

_>однако он есть и лежит в той же папке, где и этот cpp

если ты код из под среды VC++6.0 запускаешь то рабочим каталогом считается то где лежит exe, т.е. Debug/Release
Re[8]: о виртуальных функциях
От: new_user  
Дата: 16.02.05 17:56
Оценка:
1. из с билдера я запускаю код
2. этот код (тот что читает файл) работал когда было несколько класов отдельных,
поскольку они все идентичны то захотел их как-то одинаково сделать
пока не работает
Re[9]: о виртуальных функциях
От: Вадим Никулин Россия Здесь
Дата: 17.02.05 06:42
Оценка:
Здравствуйте, new_user, Вы писали:

_>1. из с билдера я запускаю код

_>2. этот код (тот что читает файл) работал когда было несколько класов отдельных,
_>поскольку они все идентичны то захотел их как-то одинаково сделать
_>пока не работает

И чего? В билдере отладчика нет? Посмотри по шагам, что и где вылетает. На крайняк посмотри в дизассемблере.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.