захватывать переменные внутри подкласса? - PullRequest
1 голос
/ 15 июня 2011

Мне было интересно, что-то подобное возможно. Возможно, используя шаблоны и обман? Единственное правило, которое я сейчас соблюдаю, это то, что вам НЕ РАЗРЕШЕНО использовать конструктор в строке классов (поэтому вы не можете передать ссылку или указатель на foo или a).

class Foo{
    int a;
public:
    struct Bar{
        int barme(){ return a; }
    };
};

Я знаю одну проблему: как bar узнает, какой экземпляр foo использовать? я не знаю, но я бы хотел, чтобы в foo было много классов Bar и более одного foo, в каждом из которых будет более одного бара.

Я уверен, что где-то видел трюк (возможно, на другом языке), но я не знаю где. Я помню шаблон, использующий const времени компиляции, но foo не будет временем компиляции в этом случае, хотя его ptr / ref может быть

Ответы [ 3 ]

7 голосов
/ 15 июня 2011

В C ++ вложенные классы - это просто классы. Это не похоже на Java, где вложенный класс поставляется с экземпляром родительского класса для поездки. Поэтому ничего подобного не возможно. Вы должны передать экземпляр Foo для работы внутри Bar. (Например, std::vector::iterator не поставляется с std::vector - это полностью независимый тип)

0 голосов
/ 15 июня 2011

В C ++ вложение одного класса в другой означает только то, что имя является вложенным, а не экземпляры - вложенные.Другими словами, если у вас есть классы A и B, такие как:

class A { 
    class B { 
        // whatever
    };
};

Тогда B, вложенный в A only , влияет на видимость задействованных имен, not как можно создавать / создавать экземпляры любого из них - например, вы можете создать A::B без необходимости создания экземпляра A.

0 голосов
/ 15 июня 2011

Задайте странный вопрос, получите странный ответ (это должно быть плечевой кость, а не копать в вас):

class Foo{
    int a;
public:
    struct Bar{
        Foo* this_;
        int barme(){ return this_->a; }
    };
};

Смотри, мама, не конструктор!

Foo foo;
Foo::Bar bar = { &foo };
bar.barme();

вам НЕ разрешено использовать конструктор в строке классов (поэтому вы не можете передать ссылку или указатель на foo или a).

Но я только что сделал! Или ты имел в виду, что я не могу? Отлично!

class Foo{
    int a;

public:
    static Foo* nothing_to_see_here;
    Foo()
    { nothing_to_see_here = this; }

    struct Bar{
        int barme(){ return nothing_to_see_here->a; }
    };
};

Смотри, мама, ничего не пропущено!

Foo foo;
Foo::Bar bar;
bar.barme();

Или вы имели в виду что-то похожее на замыкания?

// C++0x up in this
#include <functional>

class Foo{
    int a;

public:
    std::function<int()>
    bar()
    { return [=] { return a; }; }
};

Никаких пропусков в конструкторе или обмане * любого рода, гарантировано **!

Foo foo;
auto me = foo.bar();
me();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...