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

Не могу получить доступ к члену класса - C++

Восстановить пароль Регистрация
 
m5willmax
1 / 1 / 0
Регистрация: 23.08.2014
Сообщений: 8
23.08.2014, 16:43     Не могу получить доступ к члену класса #1
Недавно начал изучать C++ и SDL и появилась проблема с кодом. Я могу создать поверхность(см. код) с помощь thisFunctionWoks, но не могу создать ее при помощи thisFunctionDoesntWork. В первом случае идет присваивание результата метода "B" класса члену "A" класса, а во втором член "A" класса передается в метод "B" класса. Как мне нужно исправить код, чтобы вторая функция заработала? Я подразумеваю ответ "она не работает, потому что неправильно написал здесь и здесь. Прочитай про ...., а чтобы все заработало нужно исправить вот этот код .... на этот код ....". Заранее благодарю откликнувшихся

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//A.h 
#include "SDL.h" 
#include <string> 
class A{ 
public: 
   SDL_Surface *mSurface; //Поверхность
   string mPath; 
   A(string path); 
}; 
 
//A.cpp 
#include "A.h" 
A::A(string path){ 
   mPath=path; 
   mSurface = nullptr; 
} 
 
//B.h 
#include "SDL.h" 
#include <string> 
class B{ 
public: 
   B(); 
   SDL_Surface *thisFunctionWorks (string file); 
   void thisFunctionDoesntWork (string file, SDL_Surface *surface); 
}; 
 
//B.cpp 
#include "B.h" 
B::B(){ 
} 
 
//Определение SDL_loadBMP из SDL.h такое SDL_Surface* SDL_LoadBMP(const char* file). 
 
SDL_Surface *B::thisFunctionWorks(string file){ 
   SDL_Surface *surface = nullptr; 
   surface = SDL_LoadBMP(file.c_str()); 
   return surface; 
} 
 
B::thisFunctionDoesntWork (string file, SDL_Surface *surface){ 
   surface = SDL_LoadBMP(file.c_str()); 
} 
 
//main.cpp 
#include "A.h" 
#include "B.h" 
int main(int argc, char* argv[]) { 
   A *a; 
   a = new A("file.bmp"); 
   B *b; 
   b = new B(); 
   a->mSurface=b->thisFunctionWorks(a->mPath); 
   b->thisFunctionDoesntWork (a->mPath, a->mSurface); 
   return 0; 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2014, 16:43     Не могу получить доступ к члену класса
Посмотрите здесь:

Доступ к статической переменной-члену C++
C++ доступ к приватному члену через нестатическую ссылку
C++ Не могу получить доступ к члену класса
C++ Как получить доступ к массиву из другого класса?
C++ Как получить доступ к членам класса из функций
C++ Доступ из нестатического метода к статическому члену класса
C++ Не могу обратиться к Privat члену класса из ф-и Friend. Почему?
Как получить доступ к методам класса, который содержится в векторе класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
23.08.2014, 17:44     Не могу получить доступ к члену класса #2
Цитата Сообщение от m5willmax Посмотреть сообщение
B::thisFunctionDoesntWork (string file, SDL_Surface *surface)
Иногда создается впечатление, что указатели, как будто гипнотизируют новичков
Вот если я запишу вот так:
C++
1
2
3
4
B::thisFunctionDoesntWork (string file, int s)
{
    s = 20;
}
Ты будешь ждать, что вызывающая стороны увидит изменения s?
Короче, указатель - это "объект", в этом смысле такой же как и int, и string . Он копируется точно так же. Изменения скопированного значения адреса внутри функции никак не отразится на оригинальном значении адреса на вызывающей стороне.
Посему, нужно использовать указатель на указатель
C++
1
2
3
4
B::thisFunctionDoesntWork (string file, SDL_Surface **surface)
{
   *surface = SDL_LoadBMP(file.c_str()); 
}
либо ссылку на указатель
C++
1
2
3
4
B::thisFunctionDoesntWork (string file, SDL_Surface * & surface)
{
   surface = SDL_LoadBMP(file.c_str()); 
}
m5willmax
1 / 1 / 0
Регистрация: 23.08.2014
Сообщений: 8
23.08.2014, 17:56  [ТС]     Не могу получить доступ к члену класса #3
DrOffset, Спасибо за исчерпывающее разъяснение и работающий код. Я читал, что много проблем у новичков как раз с указателями. Примерно понимал, в чем именно может быть проблема, но из-за недостатка опыта, не знал как ее именно нужно решать.
Yandex
Объявления
23.08.2014, 17:56     Не могу получить доступ к члену класса
Ответ Создать тему
Опции темы

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