捕获子类内的变量?

时间:2011-06-14 23:06:21

标签: c++ class templates inheritance

我想知道这样的事情是可能的。也许使用模板和技巧? 现在我强制执行的唯一规则是你不允许在类栏中使用构造函数(所以你不能传入一个引用或指向foo的指针也不能传递给它。)

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

我知道一个问题是bar如何知道要使用哪个foo实例?我不知道但是我想要一个foo来拥有很多类别的Bar和多一个foo,每个都会有一个以上的吧。

我确定我在某个地方看到了一个技巧(也许是用不同的语言),但我不知道在哪里。我确实记得使用编译时const的模板但是在这种情况下foo不会是编译时间,尽管它的ptr / ref可能是

3 个答案:

答案 0 :(得分:7)

在C ++中,嵌套类只是类。它不像Java那样嵌套类带有父类的实例。因此,这样的事情是不可能的。您必须传递Foo的实例才能在Bar内进行操作。 (例如std::vector::iterator没有std::vector - 它是一个完全独立的类型)

答案 1 :(得分:0)

提出一个奇怪的问题,得到一个奇怪的答案(这意味着是肱骨而不是嘲笑你):

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

看看ma,没有构造函数!

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();

答案 2 :(得分:0)

在C ++中,将一个类嵌套在另一个类中只意味着名称是嵌套的,而不是嵌套实例。换句话说,如果您有类A和B,如:

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

然后B嵌套在A 中仅影响所涉及名称的可见性,如何创建任何实例 - 例如,你可以创建A::B而不必创建A的实例。