2013-06-18 6 views
0

C++ У меня есть класс window, parent, который создает несколько окон вкладок, child1, child2, ect .. В родительском окне есть переменные-члены для каждого дочернего окна. Я хочу получить доступ к child2 из child1 и подумал, что могу передать указатель на родительский элемент в конструкторе child1 и использовать указатель родителя для доступа к child2. Я даже не знаю, как начать. Я пробовал что-то вроде следующего и не компилируется, начиная с строки, содержащей (* this).Передача указателя на себя

class CParent 
{ 
public: 
    CParent() {}; 
    CChild1 m_Child1(*this); 
    CChild2 m_Child2; 
    .... 
}; 

class CChild1 
{ 
public: 
    CChild1(CParent *pParent) {}; 
    int getChild2Number(return pParent->m_Child2.m_number); 
}; 

class CChild2 
{ 
public: 
    CChild2() {}; 
    m_number = 1; 
} 

мне было интересно, если кто-то может помочь с 1. Получение этого компилировать без изменения до структуры слишком много 2. Консультирование по вопросам лучшего способа, чтобы установить эти отношения вверх.

+3

Откуда у вас этот код? Вы сами писали это с нуля? Почему вы не учитесь, читая книгу? –

+3

Ну, кроме всего прочего, ваше понимание того, что это такое, просто неверно. 'this' является' CParent * ', что и ожидает конструктор. Вы разыгрываете его, что приводит к «CParent», что неверно. –

+0

В качестве точки данных то, что вы пытаетесь сделать, создаст циклы зависимостей (например, «CParent -> CChild1 -> CParent»). Вам лучше было бы поставить общее состояние в отдельный класс и передать, например. 'shared_ptr' к каждому из дочерних классов. –

ответ

3

Используйте список инициализаций для детей и пройдете this. Однако имейте в виду, что некоторые применения this неверны внутри списка инициализаторов (поскольку объект все еще находится в стадии разработки, а некоторые члены еще не будут инициализированы).

Если m_Child1 необходимо использовать m_Child2, вы должны поставить m_Child2 выше m_Child1 в определении класса, так что будет инициализирован первым. Затем вы можете передать this указатель m_Child2 так:

struct CParent { 
    CParent() : m_Child1(this) { } 
private: 
    CChild2 m_Child2; 
    CChild1 m_Child1; 
}; 

Вы могли бы рассмотреть вопрос о принятии только m_Child2 к m_Child1, хотя, чтобы сделать зависимость данных явно, чтобы дать подсказку, почему m_Child2 должен прийти первым, а не дать ссылку на строящийся объект. Это будет выглядеть следующим образом:

struct CChild2; // Forward declare the class so CChild1 can accept it 
struct CChild1 { // Define CChild1 first because CParent uses it for a member 
    CChild1(CChild2 &child2); 
    // ... 
}; 
// ... 
struct CParent { 
    CParent() : m_Child1(m_Child2) { } 
private: 
    CChild2 m_Child2; 
    CChild1 m_Child1; 
}; 
1

Ваш код имеет несколько серьезных вопросов, касающихся декларации и синтаксиса определения, инициализации члена и т.д. Мой совет должен продолжать идти с основами C++.

Я предлагаю использовать динамическое хранилище для ваших детей, так как ваши вопросы дают намек на то, что их может быть более двух.

class CParent; 

class CChild 
{ 
public: 
    CChild (CParent * p_parent); 
    int get_other_child_number(size_t const other_child); 
    int number (void) { return m_number; } 
private: 
    CParent * m_parent; 
    int m_number; 
}; 

class CParent 
{ 
public: 
    CParent (void) { } 
    void add_child (void) { m_children.emplace_back(this); } 
    CChild & child (size_t const child_num) { return m_children.at(child_num); } 
    CChild const & child (size_t const child_num) const { return m_children.at(child_num); } 
    size_t num_childs (void) const { return m_children.size(); } 
private: 
    std::vector<CChild> m_children; 
}; 

CChild::CChild (CParent * p_parent) : m_parent(p_parent), m_number(p_parent->num_childs()) { } 
int CChild::get_other_child_number(size_t const other_child) 
{ 
    return m_parent->child(other_child).number(); 
} 


int main() 
{ 
    CParent par; 
    par.add_child(); 
    par.add_child(); 
    cout << "Number of Child 0 is " << par.child(0).number() << endl; 
    cout << "Number of Child 1 is " << par.child(1).number() << endl; 
    cout << "Number of Child 0 from Child 1 is " << par.child(1).get_other_child_number(0) << endl; 
    cout << "Number of Child 1 from Child 0 is " << par.child(0).get_other_child_number(1) << endl; 
}