Абстрактный класс
От: Аноним  
Дата: 06.08.07 12:30
Оценка:
Помогите решить вот это:
создал абстрактный класс

//FileDriver.h
#pragma once

class CFileDriver
{
    HANDLE m_hFile;

public:
    virtual int DesiredAccess() = 0;
    bool OpenFile(const wchar_t *);
    void CloseFile();
    CFileDriver(void);
public:
    virtual ~CFileDriver(void);
};


// FileDriver.cpp
#include "StdAfx.h"
#include "FileDriver.h"

CFileDriver::CFileDriver(void)
{
}

bool CFileDriver::OpenFile(const wchar_t * _file){
    m_hFile = CreateFile(_file, DesiredAccess(), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);    
    return true;    
}

void CFileDriver::CloseFile(){
    CloseHandle(m_hFile);    
}

CFileDriver::~CFileDriver(void) {}


создал сына:
// JReader.h
#pragma once
#include "FileDriver.h"
class CJKernel;

class СJReader:
    public CFileDriver
{
    CJKernel * pJKernel;
public:
    int DesiredAcces();
    СJReader(CJKernel *);
public:
    ~СJReader(void);
};



// JReader.cpp
#include "StdAfx.h"
#include "JReader.h"

#include "JKernel.h"

СJReader::СJReader(CJKernel * _pJKernel)
{
    pJKernel = _pJKernel;
}

int СJReader::DesiredAcces(){
    return GENERIC_READ;
}

СJReader::~СJReader(void){}


Как видно, единственный чистый виртуальный метод базового класса здесь реализован, но если сделать

CJKernel kernel;
CJReader pReader = new CJReader(&kernel);


получаем ошибку компиляции:


1>... error C2259: 'СJReader' : cannot instantiate abstract class

1> due to following members:
1> 'int CFileDriver::DesiredAccess(void)' : is abstract
1> ...\filedriver.h(8) : see declaration of 'CFileDriver::DesiredAccess'
Re: Абстрактный класс
От: NikeByNike Россия  
Дата: 06.08.07 12:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>CJKernel kernel;
А>CJReader* pReader = new CJReader(&kernel);
А>


А>получаем ошибку компиляции:
Нужно разобрать угил.
Re: Абстрактный класс
От: NikeByNike Россия  
Дата: 06.08.07 12:35
Оценка:
Здравствуйте, Аноним, Вы писали:

и

virtual int DesiredAccess() = 0;

int DesiredAccess();
Нужно разобрать угил.
Re: Абстрактный класс
От: Bell Россия  
Дата: 06.08.07 12:36
Оценка: 3 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Помогите решить вот это:

А>создал абстрактный класс

А>
А>//FileDriver.h
А>#pragma once

А>class CFileDriver
А>{
А>    virtual int DesiredAccess() = 0;
А>};

А>


А>
А>[ccode]
А>// JReader.h
А>class СJReader:
А>    public CFileDriver
А>{
А>    int DesiredAcces();
А>};

А>


Обычная синтаксическая ошибка:

DesiredAccess();
DesiredAcces();
Любите книгу — источник знаний (с) М.Горький
Re[2]: Абстрактный класс
От: Аноним  
Дата: 06.08.07 12:42
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Помогите решить вот это:

А>>создал абстрактный класс

А>>
А>>//FileDriver.h
А>>#pragma once

А>>class CFileDriver
А>>{
А>>    virtual int DesiredAccess() = 0;
А>>};

А>>


А>>
А>>[ccode]
А>>// JReader.h
А>>class СJReader:
А>>    public CFileDriver
А>>{
А>>    int DesiredAcces();
А>>};

А>>


B>Обычная синтаксическая ошибка:


B>
B>DesiredAccess();
B>DesiredAcces();
B>



Дааааааааааааа, в упор не видел, заработался наверное, огромнейшее спасибо!!!
Re: Абстрактный класс
От: eldar9x_  
Дата: 06.08.07 12:59
Оценка:
И еще вопрос: в наследнике мы перекрыли функцию

// JReader.h
const int DesiredAccess();


в чем разница, если написать вместо этого так:

// JReader.h
virtual const int DesiredAccess();


Соответственно в обоих случаях файл JReader.cpp остается одинаковым:

// JReader.сpp
...
const int СJReader::DesiredAccess(){
    return GENERIC_READ;
}
int i;
i = (i++)+(i++);
cout << i;
Re[2]: Абстрактный класс
От: NikeByNike Россия  
Дата: 06.08.07 13:11
Оценка: 3 (1)
Здравствуйте, eldar9x_, Вы писали:

_>И еще вопрос: в наследнике мы перекрыли функцию


_>
_>// JReader.h
_>const int DesiredAccess();
_>


_>в чем разница, если написать вместо этого так:


_>
_>// JReader.h
_>virtual const int DesiredAccess();
_>


Ничего не изменится.
Хотя в некоторых кодингстандартах требуют всегда писать virtual у перегруженных функций в целях большей наглядности.

http://www.rsdn.ru/Forum/message/2611242.flat.aspx
Автор: remark
Дата: 06.08.07
Нужно разобрать угил.
Re[2]: Абстрактный класс
От: Bell Россия  
Дата: 06.08.07 13:12
Оценка:
Здравствуйте, eldar9x_, Вы писали:

_>И еще вопрос: в наследнике мы перекрыли функцию


_>
_>// JReader.h
_>const int DesiredAccess();
_>


_>в чем разница, если написать вместо этого так:


_>
_>// JReader.h
_>virtual const int DesiredAccess();
_>


Разницы нет. Однако второй вариант информативней.

ЗЫ
Зачем возвращать const int, а не просто int?
Любите книгу — источник знаний (с) М.Горький
Re[3]: Абстрактный класс
От: eldar9x_  
Дата: 06.08.07 13:20
Оценка:
Здравствуйте, Bell, Вы писали:

B>Зачем возвращать const int, а не просто int?


просто привычка, лучше видно что возвращается не переменная, а константа
int i;
i = (i++)+(i++);
cout << i;
Re[3]: Абстрактный класс
От: IROV..  
Дата: 06.08.07 13:51
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Ничего не изменится.

NBN>Хотя в некоторых кодингстандартах требуют всегда писать virtual у перегруженных функций в целях большей наглядности.
если програмиш под VS8.0 то мой совет ставь модификатор override и больше проблем не будет
я не волшебник, я только учусь!
Re[4]: Абстрактный класс
От: NikeByNike Россия  
Дата: 06.08.07 14:04
Оценка:
Здравствуйте, IROV.., Вы писали:

NBN>>Ничего не изменится.

NBN>>Хотя в некоторых кодингстандартах требуют всегда писать virtual у перегруженных функций в целях большей наглядности.
IRO>если програмиш под VS8.0 то мой совет ставь модификатор override и больше проблем не будет

Да у меня и нет никаких проблем.

P.S.
А что ставить если программишь на _С++_ под _10_ компилеров одновременно?
Нужно разобрать угил.
Re[5]: Абстрактный класс
От: Erop Россия  
Дата: 06.08.07 14:32
Оценка: :)
Здравствуйте, NikeByNike, Вы писали:

NBN>А что ставить если программишь на _С++_ под _10_ компилеров одновременно?

Разумеется override, а на тех компиляторах, которые этого е умеют определи
#define override virtual
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Абстрактный класс
От: IROV..  
Дата: 06.08.07 21:35
Оценка:
Здравствуйте, Erop, Вы писали:

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


NBN>>А что ставить если программишь на _С++_ под _10_ компилеров одновременно?

E>Разумеется override, а на тех компиляторах, которые этого е умеют определи
#define override virtual


Кстати и вам советую использовать в VC80 этот модификатор.


З.Ы. (шепотом) override пишется после обьявление функции.
я не волшебник, я только учусь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.