979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

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

07.07.2015, 10:42. Показов 1145. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здорова!
Есть код:
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???
В книге вроде код такой и должен работать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2015, 10:42
Ответы с готовыми решениями:

Невозможно обратиться к private -члену
Подскажите пожалуйста,в чем проблема, из-за создания объекта компилятор выдает ошибку. Класс...

Error:невозможно обратится к private члену
Доброго времени суток! есть класс, наследуемый от CAsyncSocket обьявляю его так #pragma once ...

QWidget::operator =: невозможно обратиться к private член
Я попытался в class Nightcharts добавить базовый public QWidget но выходит ошибка( error...

Невозможно обратиться к private член, объявленному в классе
View.h #pragma once #include &quot;Model.h&quot; class View { private: ModelClass model; public:...

8
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
07.07.2015, 11:23 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;
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.07.2015, 12:08  [ТС] 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 не работает пишет ошибку.
0
Неэпический
17848 / 10616 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
07.07.2015, 12:15 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)) ;
}
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
07.07.2015, 13:24  [ТС] 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));
получаем указатель на класс и его используем
0
5231 / 3203 / 362
Регистрация: 12.12.2009
Сообщений: 8,112
Записей в блоге: 2
07.07.2015, 13:42 6
Цитата Сообщение от ninja2 Посмотреть сообщение
Если я пишу отак METHOD_PROLOGUE_my(CObject_my,One), то все нормально, а если я добавляю так METHOD_PROLOGUE_my(CObject_my,Two) почему то оно работает хз. как, функция вызывается левая для указателя не fTwo, а другая fOne хотя указатель вроде на ITwo.
Вообще что попало выводится?
Ты где-то выдрал макрос из контекста и пытаешься его использовать без понимания происходящего. В общем он у тебя работает, потому что так совпало.
В С++ объект вложенного класса может быть создан без объекта внешнего класса (в Java, например, так сделать нельзя, если вложенный класс не статичный), поэтому этот макрос может привести к непонятно к чему, в лучшем случае к SIGSEGV (в худшем оно будет работать без падение с левыми данными).

Лучше пока забудь про этот макрос и сформулируй еще раз задачу.
0
Заблокирован
Автор FAQ
07.07.2015, 22:41 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 члену  
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
09.07.2015, 14:39  [ТС] 8
-=ЮрА=-, ну да, этот пример разобрал.

Добавлено через 3 минуты
А где макрос пропал? , это типо указатель хранить во вложенных классах. Ясно.
0
-=ЮрА=-
09.07.2015, 20:58     Ошибки в коде с вложеными классами: Невозможно обратиться к private члену
  #9

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.07.2015, 20:58

Невозможно обратиться к private член, объявленному в классе "Complex"
выдавало ошибку &quot;невозможно обратиться к private член, объявленному в классе &quot;Complex&quot;&quot; я поменяла...

Как обратиться к члену класса?
У меня есть класс: class MyButton : System.Windows.Forms.Button { Point...

Как обратиться к члену класса
Здравствуйте! Есть такой код: class ClassA { ... public: int t; }; class ClassB:public...

Как обратиться к каждому члену столбца?
Как обратиться к каждому члену столбца? См скрин или вложение. Спасибо!


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru