Как получить экземпляр вложенного класса в С++

У меня есть следующий код:

class outer
{
    struct inner
    {
        int var1;
        int var2;
        inner() { var1 = 1; var2 = 2; }
    };

    inner inner_instance;

public:
    const inner *get_inner() { return &inner_instance; }
};

int main(int argc, char *argv[])
{
    // 1
    outer outer_instance;
    cout << outer_instance.get_inner()->var1 << endl;

    // 2
    // this cannot be compiled because outer::inner is private
    //const outer::inner *inner_ref = outer_instance.get_inner();
    //cout << inner_ref->var1;

    // 3
    const int *inner_var2 = (int *) outer_instance.get_inner();
    inner_var2++;
    cout << *inner_var2 << endl;

    return 0;
}

Я понимаю, почему No.2 не может быть скомпилирован. Я просто не знаю, какова идея дизайна компилятора, который разрешает доступ к общедоступным полям частного вложенного класса, но не к самому вложенному классу, как № 1. Данные экземпляра все еще находятся в памяти. Если я знаю структуру такого закрытого вложенного класса, я все равно могу добиться назначения, как это делает № 3.

Означает ли это, что лучше не возвращать указатель или ссылку на закрытый вложенный класс в общедоступной функции? А если мне действительно нужно что-то о вложенном классе вернуть во внешний мир, сделать его общедоступным?

Спасибо!


person Crend King    schedule 03.03.2010    source источник
comment
Нет, если вы хотите что-то скрыть, сделайте это приватным, а не публичным.   -  person Narendra N    schedule 03.03.2010


Ответы (2)


Поместите внутреннее определение структуры в открытый доступ, если вы хотите использовать его вне внешнего класса.

class outer
{
public:
    struct inner
    {
        int var1;
        int var2;
        inner() { var1 = 1; var2 = 2; }
    };
private:
    inner inner_instance;
public:
    const inner *get_inner() { return &inner_instance; }
};
person Phong    schedule 03.03.2010

Вы правы, лучше всего, если типы, используемые в общедоступном API, не являются частными. Однако они могут быть объявлены только вперед (если вы используете только указатели или ссылки в API).

person Tronic    schedule 03.03.2010
comment
Приватные вложенные классы должны использоваться ТОЛЬКО их хост-классами, верно? - person Crend King; 03.03.2010