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

Ошибки в коде с вложеными классами: Невозможно обратиться к private члену - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.07.2015, 10:42     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #1
Здорова!
Есть код:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
using std::cout;
 
#include <afxwin.h>
 
#define IDD_One 1
#define IDD_Two 2
#define IDD_IUnknown_my 3
 
struct IUnknown_my
{
    virtual BOOL QueryInterfece(int InId,void** pObj)=0;
};
 
struct IOne : public IUnknown_my
{
    virtual int& fOne()=0;
};
 
struct ITwo : public IUnknown_my
{
    virtual int& fTwo()=0;
};
 
class CObject_my
{
protected:
    int m_value1;
    int m_value2;
public:
    CObject_my(){m_value1=m_value2=0;}
 
    class XOne : public IOne
    {
        XOne(){}//с коснтруктором не работает
        virtual int& fOne();
        virtual BOOL QueryInterfece(int InId,void** pObj);
    }m_xOne;
 
    class XTwo : public ITwo
    {
        XTwo(){}//с конструктором не работатет
        virtual int& fTwo();
        virtual BOOL QueryInterfece(int InId,void** pObj){}
    }m_xTwo;
 
    friend class XOne;
    friend class XTwo;
};
 
int& CObject_my::XOne::fOne()
{
    METHOD_PROLOGUE(CObject_my,One)
    return pThis->m_value1;
}
 
int& CObject_my::XTwo::fTwo()
{
    METHOD_PROLOGUE(CObject_my,Two)
    return pThis->m_value2;
}
 
BOOL CObject_my::XOne::QueryInterfece(int InId,void** pObj)
{
    METHOD_PROLOGUE(CObject_my,Two)
    switch(InId)
    {
    case IDD_IUnknown_my:
    case IDD_One:
        *pObj=&pThis->m_xOne;
    case IDD_Two:
        *pObj=&pThis->m_xTwo;
    }
}
 
void GetClassObject(void** pObj)
{
    CObject_my* ptr=new CObject_my();
    IOne* p=&ptr->m_xOne;
    *pObj=&p;
}
 
int main()
{
    IOne* pOne;//интерфейс 1
    ITwo* pTwo;//интерфейс 2 
 
    //получаем первый интерфейс
    GetClassObject((void**)&pOne);
    cout <<"pOne-fOne()= "<<pOne->fOne()<<"\r\n";
    pOne->fOne();
    cout <<"pOne-fOne()= "<<pOne->fOne()<<"\r\n";
    
    //из первого получаем второй интерфейс
    pOne->QueryInterfece(IDD_Two,(void**)&pTwo);
    cout <<"pTwo-fTwo()= "<<pTwo->fTwo()<<"\r\n";
    pTwo->fTwo()=100;
    cout <<"pTwo-fTwo()= "<<pTwo->fTwo()<<"\r\n";
 
 
    return 0;
}
При компиляцыи пишет ошибку:
1>d:\visual studio 2010\projects\test\test\main.cpp(31): error C2248: CObject_my::XOne::XOne: невозможно обратиться к private член, объявленному в классе "CObject_my::XOne"
1> d:\visual studio 2010\projects\test\test\main.cpp(35): см. объявление "CObject_my::XOne::XOne"
1> d:\visual studio 2010\projects\test\test\main.cpp(33): см. объявление "CObject_my::XOne"
1>d:\visual studio 2010\projects\test\test\main.cpp(31): error C2248: CObject_my::XTwo::XTwo: невозможно обратиться к private член, объявленному в классе "CObject_my::XTwo"
1> d:\visual studio 2010\projects\test\test\main.cpp(42): см. объявление "CObject_my::XTwo::XTwo"
1> d:\visual studio 2010\projects\test\test\main.cpp(40): см. объявление "CObject_my::XTwo"
1>d:\visual studio 2010\projects\test\test\main.cpp(53): error C2039: m_xXOne: не является членом "CObject_my"


Типо мешает конструктор во вложеных классах. Там когда я закомментирую конструкторы во вложеных классах, то вылазит другая ошибка касающаяся макроса METHOD_PROLOGUE:
1>d:\visual studio 2010\projects\test\test\main.cpp(53): error C2039: m_pModuleState: не является членом "CObject_my"
1> d:\visual studio 2010\projects\test\test\main.cpp(26): см. объявление "CObject_my"
1>d:\visual studio 2010\projects\test\test\main.cpp(59): error C2039: m_pModuleState: не является членом "CObject_my"
1> d:\visual studio 2010\projects\test\test\main.cpp(26): см. объявление "CObject_my"
1>d:\visual studio 2010\projects\test\test\main.cpp(65): error C2039: m_pModuleState: не является членом "CObject_my"
1> d:\visual studio 2010\projects\test\test\main.cpp(26): см. объявление "CObject_my"


Ниче не ясно почему нельзя конструкторы во вложеных классах создавать? и что это за член m_pModuleState???
В книге вроде код такой и должен работать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 10:42     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену
Посмотрите здесь:

Написал задание с классами, по примеру, но в public выдает ошибки, незнаю как их переделать :) C++
C++ Невозможно обратиться к private член, объявленному в классе "Complex"
Ошибки в работе программы с классами, наследованием и т.д C++
Нужно найти ошибку в коде. С Классами C++
Невозможно обратиться к protected член, объявленному в классе "Counter" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
07.07.2015, 11:23     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #2
C++
1
2
3
4
5
6
    class XOne : public IOne
    {
        XOne(){}//с коснтруктором не работает 
        virtual int& fOne();
        virtual BOOL QueryInterfece(int InId,void** pObj);
    }m_xOne;
Потому что конструктор в private
C++
1
2
3
4
5
6
7
8
    class XOne : public IOne
    {
    public:
        XOne(){}
    private:
        virtual int& fOne();
        virtual BOOL QueryInterfece(int InId,void** pObj);
    }m_xOne;
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.07.2015, 12:08  [ТС]     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #3
А как получить доступ из вложенных классов к переменным членам внешнего класса?
METHOD_PROLOGUE(CObject_my,One) че то ошибку выдает.

Добавлено через 17 минут
Так как можно получить доступ из вложеного класса к переменным внешнего класса?
C++
1
2
3
4
5
6
int& CObject_my::XOne::fOne()
{
    cout <<"mu tyt\r\n";
    METHOD_PROLOGUE(CObject_my,One) 
    return pThis->m_value1;
}
m_value1 мне нужно вернуть, как получить к нему доступ? METHOD_PROLOGUE не работает пишет ошибку.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,869
Записей в блоге: 2
Завершенные тесты: 1
07.07.2015, 12:15     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Так как можно получить доступ из вложеного класса к переменным внешнего класса
Так же, как и не из вложенного:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
 
class Test
{
public:
    int x ;
    Test( int x_ ) : x(x_) {}
    
    class Sub
    {
    public:
        void print ( const Test & obj ) const { std::cout << obj.x << std::endl ; }
    };
};
 
 
int main(){
    Test::Sub obj ;
    obj.print(Test(54)) ;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
07.07.2015, 13:24  [ТС]     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Так же, как и не из вложенного:
Так это нужно объект в функцию передавать как параметр, а нужно получить без передачи объекта, как было бы с использование METHOD_PROLOGUE(CObject_my,One) , как то так.
Там макрос:
C++
1
2
3
4
5
#define METHOD_PROLOGUE(theClass, localClass) \
    theClass* pThis = \
        ((theClass*)((BYTE*)this - offsetof(theClass, m_x##localClass))); \
    AFX_MANAGE_STATE(pThis->m_pModuleState) \
    pThis; // avoid warning from compiler \
У меня он не работает типо нету m_pModulesState, что это такое хз.

Добавлено через 25 минут
Переписал макрос без второй части от так:
C++
1
2
3
#define METHOD_PROLOGUE_my(theClass, localClass) \
    theClass* pThis = \
        ((theClass*)((BYTE*)this - offsetof(theClass, m_x##localClass))); \
Вроде работает, только я не пойму как он работает, от код функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BOOL CObject_my::XOne::QueryInterfece(int InId,void** pObj)
{
    METHOD_PROLOGUE_my(CObject_my,One)
    switch(InId)
    {
    case IDD_IUnknown_my:
    case IDD_One:
        *pObj=&pThis->m_xOne;
        cout <<"mu tyt1\r\n";
        break;
    case IDD_Two:
        *pObj=&pThis->m_xTwo;
        cout <<"mu tyt2\r\n";
        break;
    default:
        *pObj=NULL;
        return FALSE;
    }
    return TRUE;
}
Если я пишу отак METHOD_PROLOGUE_my(CObject_my,One), то все нормально, а если я добавляю так METHOD_PROLOGUE_my(CObject_my,Two) почему то оно работает хз. как, функция вызывается левая для указателя не fTwo, а другая fOne хотя указатель вроде на ITwo.
Вообще что попало выводится?

Добавлено через 22 минуты
Croessmah, Можно еще вроде от так получить:
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
#include <iostream>
using std::cout;
 
 
class Test
{
public:
    int x ;
    Test( int x_=0 ) : x(x_) {}
    
    class Sub
    {
    public:
        void print () const 
        {
            Test* pThis=(Test*)((unsigned char*)this - offsetof(Test, m_xSub));
            std::cout << pThis->x<< std::endl ; 
        }
    }m_xSub;
};
 
int main()
{
    Test* p=new Test(100);
    Test::Sub* obj=&p->m_xSub;
    obj->print();
}
Test* pThis=(Test*)((unsigned char*)this - offsetof(Test, m_xSub));
получаем указатель на класс и его используем
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
07.07.2015, 13:42     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Если я пишу отак METHOD_PROLOGUE_my(CObject_my,One), то все нормально, а если я добавляю так METHOD_PROLOGUE_my(CObject_my,Two) почему то оно работает хз. как, функция вызывается левая для указателя не fTwo, а другая fOne хотя указатель вроде на ITwo.
Вообще что попало выводится?
Ты где-то выдрал макрос из контекста и пытаешься его использовать без понимания происходящего. В общем он у тебя работает, потому что так совпало.
В С++ объект вложенного класса может быть создан без объекта внешнего класса (в Java, например, так сделать нельзя, если вложенный класс не статичный), поэтому этот макрос может привести к непонятно к чему, в лучшем случае к SIGSEGV (в худшем оно будет работать без падение с левыми данными).

Лучше пока забудь про этот макрос и сформулируй еще раз задачу.
-=ЮрА=-
Заблокирован
Автор FAQ
07.07.2015, 22:41     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #7
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
using namespace std;
 
#include <afxwin.h>
 
#define IDD_One 1
#define IDD_Two 2
#define IDD_IUnknown_my 3
 
struct IUnknown_my{
    virtual BOOL QueryInterfece(int InId,void** pObj)=0;
};
 
struct IOne : IUnknown_my{
    virtual int& fOne()=0;
};
 
struct ITwo : IUnknown_my{
    virtual int& fTwo()=0;
};
 
class CObject_my
{
protected:
    int m_value1;
    int m_value2;
 
    class XOne : public IOne
    {
        CObject_my * pThis;
    public:
        XOne(void * ptr = 0){
            pThis = reinterpret_cast<CObject_my *>(ptr);
        }
        virtual int& fOne();
        virtual BOOL QueryInterfece(int InId,void** pObj);
    }m_xOne;
 
    class XTwo : public ITwo
    {
        CObject_my * pThis;
    public:
        XTwo(void * ptr = 0){
            pThis = reinterpret_cast<CObject_my *>(ptr);
        
        }
        virtual int& fTwo();
        virtual BOOL QueryInterfece(int InId,void** pObj);
    }m_xTwo;
public:
    CObject_my() : m_value1(0), m_value2(0), m_xOne(this), m_xTwo(this) {}
    virtual BOOL QueryInterfece(int InId,void** pObj);
 
};
 
int& CObject_my::XOne::fOne()
{
    return pThis->m_value1;
}
 
int& CObject_my::XTwo::fTwo()
{
    return pThis->m_value2;
}
 
BOOL CObject_my::QueryInterfece(int InId,void** pObj){
    BOOL bRet = FALSE;
    switch(InId)
    {
        case IDD_One:
            *pObj = &this->m_xOne;
            bRet  = TRUE;
            break;
        case IDD_Two:
            *pObj = &this->m_xTwo;
            bRet  = TRUE;
            break;
    }
    return bRet;
}
 
BOOL CObject_my::XOne::QueryInterfece(int InId,void** pObj)
{
    BOOL bRet = FALSE;
    if( pThis )
    {
        switch(InId)
        {
        case IDD_IUnknown_my:
            *pObj= &pThis;
            break;
        case IDD_Two:
            *pObj= &pThis->m_xTwo;
            bRet = TRUE;
            break;
        }
    }
    return bRet;
}
 
BOOL CObject_my::XTwo::QueryInterfece(int InId,void** pObj)
{
    BOOL bRet = FALSE;
    if( pThis )
    {
        switch(InId)
        {
        case IDD_IUnknown_my:
            *pObj= &pThis;
            break;
        case IDD_One:
            *pObj= &pThis->m_xOne;
            bRet = TRUE;
            break;
        }
    }
    return bRet;
}
 
int main()
{
    IOne* pOne = 0;//интерфейс 1
    ITwo* pTwo = 0;//интерфейс 2 
 
    //получаем первый интерфейс
    CObject_my* ptr=new CObject_my();
    ptr->QueryInterfece(IDD_One,(void**)&pOne);
    cout <<"pOne-fOne()= "<<pOne->fOne()<<"\r\n";
    pOne->fOne();
    cout <<"pOne-fOne()= "<<pOne->fOne()<<"\r\n";
    
    //из первого получаем второй интерфейс
    ptr->QueryInterfece(IDD_Two,(void**)&pTwo);
    cout <<"pTwo-fTwo()= "<<pTwo->fTwo()<<"\r\n";
    pTwo->fTwo()=100;
    cout <<"pTwo-fTwo()= "<<pTwo->fTwo()<<"\r\n";
    system("pause");
    return 0;
}
Миниатюры
Ошибки в коде с вложеными классами: Невозможно обратиться к private члену  
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
09.07.2015, 14:39  [ТС]     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену #8
-=ЮрА=-, ну да, этот пример разобрал.

Добавлено через 3 минуты
А где макрос пропал? , это типо указатель хранить во вложенных классах. Ясно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2015, 20:58     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену
Еще ссылки по теме:

Невозможно обратиться к private -члену C++
C++ Не могу обратиться к Privat члену класса из ф-и Friend. Почему?
C++ Как обратиться к члену класса

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
09.07.2015, 20:58     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену
  #9

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
А где макрос пропал? , это типо указатель хранить во вложенных классах. Ясно.
- конкретно для твоего проекта пролог не нужен, лучше использовать простые вещи как список инициализации чем притягивать за уши дополнительные трудности(я исповедую такую идеологию - всё идеальное должно быть просто)

Yandex
Объявления
09.07.2015, 20:58     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену
Ответ Создать тему
Опции темы

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