2014-09-18 3 views
0

Я пытаюсь создать структуру с тремя классами в качестве членов, и для моей идеи работы я хочу, чтобы экземпляры моих классов имели доступ к экземплярам сестер внутри одной структуры. Итак, скажем, после инициализации struct, я хочу, чтобы мой custom_class_one мог вызвать методы инициализации sister custom_class_two. Возможно ли это сделать? Вот мой заголовочный файл:Доступ к экземпляру сестра класса

struct custom_wrapper 
{ 
public: 
    custom_wrapper(); 

    class custom_class_one 
    { 
    private: 
     int number1; 
    public: 
     int getNumber1(); 
    }; 

    class custom_class_two 
    { 
    private: 
     int number2; 
    public: 
     int getNumber2(); 
    }; 

    class custom_class_three 
    { 
    private: 
     int number3; 
    public: 
     int getNumber3(); 
    }; 

};

+1

У вас недостаточно кода, чтобы продемонстрировать, как вы собираетесь использовать свои внутренние классы. Класс - это тип, а нестатические методы должны быть вызваны против экземпляра. – jxh

+1

Где ваше чувство приключений? Попробуй. Посмотрите, работает ли это. Если что-то не работает, что вы думаете, должно работать, спросите здесь подробности. Если что-то работает, что, по вашему мнению, не должно работать, еще раз спросите здесь подробности. –

+0

BTW, C++ имеет функции-члены. При определенных обстоятельствах, которые не применяются в вашем примере, они могут получить большую часть семантики теоретических методов CS. –

ответ

0

До тех пор, пока ваши методы доступны и классы могут видеть друг друга (вперед объявляя при необходимости), это может быть сделано:

struct custom_wrapper 
{ 
public: 
    custom_wrapper(); 

    class custom_class_two; // Forward declaration for inner class 

    class custom_class_one 
    { 
    private: 
     int number1; 
    public: 
     int getNumber1(); 
     int accessSisterMethods(custom_class_two& obj) { 
     return obj.getNumber2(); 
     } 
    }; 

    class custom_class_two 
    { 
    private: 
     int number2; 
    public: 
     int getNumber2() { 
      return 42; 
     } 
    }; 

    class custom_class_three 
    { 
    private: 
     int number3; 
    public: 
     int getNumber3(); 
    }; 
}; 


int main() 
{ 
    custom_wrapper::custom_class_one obj1; 
    custom_wrapper::custom_class_two obj2; // Need a sister object 

    std::cout << obj1.accessSisterMethods(obj2); 
} 

Example

Конечно вам нужно пример другого класса сестры (если вы не вызываете статические методы, но я рассматриваю код, который вы опубликовали).

+0

В некоторых случаях также может потребоваться использование определений функций вне линии. –

+0

Спасибо, это все еще неясно, но, по крайней мере, у меня есть туманная идея, что делать! Не могли бы вы также указать, как вызвать конструктор child в родительском конструкторе? – DKMudrechenko

+0

Я бы сам экспериментировал;) –

0

Исходя из ваших комментариев, которые я думаю, что вы путаете несколько понятий здесь: состава, вложенных классов, экземплярами. Или я не понимаю ваш вопрос и удалю/отредактирую ответ.

Когда вы говорите «экземпляры сестер в пределах одной структуры« Я думаю, вы действительно ищете композицию. Как и в , существует соотношение. Вам не нужно иметь вложенные классы для создания композиции. Для композиции вам нужны переменные-члены.

Возможно, что вы действительно хотите что-то вроде этого, поправьте меня, если я ошибаюсь:

struct CustomClassA { 
private: 
    int number; 
public: 
    int getNumber() { return number; } 
}; 

struct CustomClassB { 
private: 
    int number; 
public: 
    int getNumber() { return number; } 
}; 

struct CustomClassC { 
private: 
    int number; 
public: 
    int getNumber() { return number; } 
}; 

struct CustomWrapper { 
private: 
    CustomClassA a; 
    CustomClassB b; 
    CustomClassC c; 
}; 

Таким образом, если вы создаете экземпляр CustomWrapperимеет так ли экземпляры пользовательских классов, a , b и c. Он «владеет» ими.

И затем вы хотите, чтобы три пользовательских класса могли общаться друг с другом. Существует ряд способов достижения этого. Пользовательские классы могут иметь указатели на другие классы сестры. Они могут быть установлены в конструкторе CustomWrapper:

#include <iostream> 

struct CustomClassB; // Forward declaration for member pointer in CustomClassA. 

struct CustomClassA { 
private: 
    int   number; 
    CustomClassB* b; // Member pointer to CustomClassB. 
public: 
    CustomClassA() : number(1), b(nullptr) {} // Initialized sister b to nullptr. 
    void setSisterB(CustomClassB *sister_b) { b = sister_b; } 
    int getNumber() { return number; } 
}; 

struct CustomClassB { 
private: 
    int   number; 
    CustomClassA* a; 
public: 
    CustomClassB() : number(2), a(nullptr) {} 
    void setSisterA(CustomClassA *sister_a) { a = sister_a; } 

    int getNumber() { 
    if (a) // Check a is not null 
     return a->getNumber() + number; // Use pointer to sister a 
    return number; 
    } 
}; 

struct CustomClassC { 
private: 
    int   number; 
    CustomClassA* a; 
    CustomClassB* b; 
public: 
    CustomClassC() : number(4), a(nullptr), b(nullptr) {} 
    void setSisterA(CustomClassA* sister_a) { a = sister_a; } 
    void setSisterB(CustomClassB* sister_b) { b = sister_b; } 
    int getNumber() { return number; } 
}; 

struct CustomWrapper { 
private: 
    CustomClassA a; 
    CustomClassB b; 
    CustomClassC c; 
public: 
    CustomWrapper() { 
    a.setSisterB(&b); // Set the pointers to the sister custom 
    b.setSisterA(&a); // classes in each custom class in the 
    c.setSisterA(&a); // constructor of CustomWrapper. 
    c.setSisterB(&b); 
    } 
    int getAnswer() { 
    return b.getNumber() + c.getNumber(); 
    } 
}; 

int main() { 
    CustomWrapper wrapper; 
    std::cout << wrapper.getAnswer(); 
} 

или пользовательские классы могут иметь указатель на пользовательские оболочки и общаться со своими сестрами через обертку.

Смежные вопросы