2013-12-25 1 views
2

Как получить доступ к члену статического члена другого класса?Член статического члена

Как так:

code.hpp:

class A 
{ 
public: 
    int* member; 
    A(); 
}; 

class B 
{ 
public: 
    static A* StatOBJ; 
}; 

code.cpp:

A* B::StatOBJ = new A(); 
int* B::StatOBJ->member = 42    //ERROR 

Я предпочел бы, чтобы это вне основного() (или любой другой функции - точно так же, как и статические переменные), но я попробовал его и в main().

A() присваивает значение члену (и поэтому инициализирует его), и я хочу его изменить.

Когда я пытаюсь скомпилировать это я получаю:

ошибка: ожидается инициализатор до того '->' лексем

на линии с // ОШИБКА

+2

"member" по умолчанию является частным. Таким образом, вы не можете получить к нему доступ. – OldProgrammer

+0

Попробуйте что-то безумное: 'A * B :: StatObj = (B :: StatObj = new A, B :: StatObj-> member = 42, B :: StatObj);' –

+0

Извините, забыл опубликовать там – Mlha

ответ

3

A::member не объявлен как static, так не указывать тип данных снова при назначении его значение:

B::StatObJ->member = ...; 

Кроме того, A::member объявляется как точка э, так что вы должны передать его, прежде чем вы можете присвоить ему значение:

B::StatObJ->member = new int; 
*(B::StatObJ->member) = 42; 

Или:

B::StatObJ->member = new int(42); 

В любом случае, оба эти было бы лучше, давая A конструктор для обработки что распределение/назначение:

class A 
{ 
public: 
    int* member; 
    A(); 
    ~A(); 
}; 

A::A() 

    : member(new int(42)) 
{ 
} 

A::~A() 
{ 
    delete member; 
} 

A* B::StatObJ = new A(); 

Или лучше:

class A 
{ 
public: 
    int* member; 
    A(int value); 
    ~A(); 
}; 

A::A(int value) 
    : member(new int(value)) 
{ 
} 

A::~A() 
{ 
    delete member; 
} 

A* B::StatObJ = new A(42); 
0

Некоторые незначительные изменения в код:

#include <iostream> 

class A 
{ 
    public: //needs to be public 
    int* member; 
}; 

class B 
{ 
    public: // needs to be public 
    static A* StatOBJ; 
}; 
A* B::StatOBJ; //needs to be "defined" not just "declared" 



int main(){ 
    B::StatOBJ = new A(); // you dont want to allocate more memory so drop the type 
    B::StatOBJ->member = new int(42); // unless you change A::member to int instead of (*int) this must be done 
}