Форум программистов, компьютерный форум CyberForum.ru

Нарушение прав доступа при записи - C++

Восстановить пароль Регистрация
 
inhalesulfur
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 6
30.06.2013, 07:15     Нарушение прав доступа при записи #1
Пытаюсь написать класс, который бы выполнял инициализацию шрифта в directx и печатал строку на экран.
Написал рабочий вариант, где инициализация Direct3D и шрифтов происходит в одном классе, помогите, пожалуйста теперь разделить их по разным классам.

cFont.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
//-----------------------------------------------------------------------------------
// Инициализация шрифтов
//-----------------------------------------------------------------------------------
#include "../include/cGlobal.h"
#include "../include/cGraphics.h"
//-----------------------------------------------------------------------------------
class cFont
{
private:
    
    RECT            Rec;
    CGraphics*      cGraphics;          // Указатель на класс, инициализирующий устройство Direct3D
 
public:
    cFont();
    ~cFont();
    BOOL            InitFont();
    LPD3DXFONT      GetFont()   { return pFont; }
 
};
cFont.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "../include/cFont.h"
 
cFont::cFont()
{
    pFont               = NULL;
    hFont               = NULL;
};
cFont::~cFont()
{
    SAFE_RELEASE( pFont );
};
BOOL cFont::InitFont()
{
    // Создаем шрифт
    if(NULL == (hFont = CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH | FF_MODERN,"Arial")))
        return FALSE;   
    // Инициализируем шрифт
    if(FAILED(D3DXCreateFont(cGraphics->GetDevice(),30,10,0,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN, "Arial", &pFont)))
        return FALSE;
     return TRUE;
};
при обращении к методу InitFont() в 15 строке выдает ошибку
Кликните здесь для просмотра всего текста
Необработанное исключение в "0x002cb083" в "LostDevice.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcdd1".


Никак не могу понять, почему метод класса не может записать значение в переменную hFont того же класса.
Пытаюсь вызвать его из другого класса, объявив указатель cFont* m_pFont; m_pFont->InitFont( );
Кому не сложно, напишите как должен выглядеть класс, из которого я вызываю InitFont();

Добавлено через 13 минут
В похожей теме нашел ответ, что проблема может быть в том, что не вызывается конструктор и соответственно не инициализируется переменная hFont, и действительно оказалось, что программа не заходит в тело конструктора. В чем может быть причина? Остальные конструкторы, тысячи их, вызываются автоматически ^.^
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11837 / 6816 / 771
Регистрация: 27.09.2012
Сообщений: 16,908
Записей в блоге: 2
Завершенные тесты: 1
30.06.2013, 07:16     Нарушение прав доступа при записи #2
Цитата Сообщение от inhalesulfur Посмотреть сообщение
В чем может быть причина?
как создается объект?
inhalesulfur
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 6
30.06.2013, 07:23  [ТС]     Нарушение прав доступа при записи #3
Добавил вызов конструктора перед проблемной строкой, ошибка не исчезла =\

Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
как создается объект?
Я просто создаю указатель на класс и через него обращаюсь к методу. Не создавая объектов. По крайней мере основные функции визуализации работают таким макаром.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11837 / 6816 / 771
Регистрация: 27.09.2012
Сообщений: 16,908
Записей в блоге: 2
Завершенные тесты: 1
30.06.2013, 07:28     Нарушение прав доступа при записи #4
Цитата Сообщение от inhalesulfur Посмотреть сообщение
Я просто создаю указатель на класс и через него обращаюсь к методу. Не создавая объектов.
Нет объекта - нет вызова конструктора и нет переменных этого объекта!!!
А указатель можно хоть на валенки поставить, только валенки от этого не скатаются
inhalesulfur
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 6
30.06.2013, 07:43  [ТС]     Нарушение прав доступа при записи #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет объекта - нет вызова конструктора и нет переменных этого объекта!!!
А указатель можно хоть на валенки поставить, только валенки от этого не скатаются
Ясно.
Я пока плохо представляю себе структуру ООП.)

Допустим у меня есть класс cGraphics, отвечающий за подключение графического устройства. В нем есть переменная pDevice, содержащая адрес устройства, метод Init(), подключающий устройство и метод GetDevice(), возвращающий адрес устройства.
Потом в классе cApp я создаю объект класса cGraphics и подключаю устройство.
Выходит, чтобы обратиться к устройству из класса cFont я должен передать ему адрес объекта, объявленного в cApp, а не адрес класса сGraphics? И вызвать cApp->GetDevice(), чтобы получить устройство, а не cGraphics->GetDevice()?
Помогите вникнуть плз)
Yandex
Объявления
30.06.2013, 07:43     Нарушение прав доступа при записи
Ответ Создать тему
Опции темы

Текущее время: 13:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru