【问题标题】:capture variables inside of subclass?在子类中捕获变量?
【发布时间】:2011-09-15 02:59:54
【问题描述】:

我想知道这样的事情是可能的。也许使用模板和诡计? 现在我要强制执行的唯一规则是你不能在类 bar 中使用构造函数(所以你不能传入指向 foo 或 a 的引用或指针)。

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

我知道一个问题是 bar 如何知道要使用哪个 foo 实例?我不知道,但我希望 foo 有许多类的 Bar 和多个类 foo,每个类将有多个类。

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

【问题讨论】:

  • 不允许使用构造函数?祈祷告诉这个对象是如何创建的?你知道编译器会创建一个默认构造函数、析构函数、复制构造函数和赋值运算符,如果你不提供一个:P 另请注意,这不会编译你的意思是让 Bar 继承自 Foo 吗?
  • @AJG85:是的,我的意思是一个不平凡/默认的 ctor
  • @AJG85:由于访问了a,它无法编译,这是 OP 询问的问题。继承并不总是解决方案;嵌套类通常非常好。 (不过,在这种情况下,似乎不需要嵌套类。)
  • 我认为你能做的最好的事情是添加一个 Foo* 作为 Bar 中的成员和构造函数参数,并确保对来自 Bar 的任何引用都通过该引用(可能需要一个朋友声明太)

标签: c++ class templates inheritance


【解决方案1】:

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

【讨论】:

  • 我可以通过模板神奇地传递一个吗?我希望有这样的东西?所以我可以做到 Foo::Bar<int> v 并让它完成所有工作,而无需我写 the_ctor:v(this){} 来实例化它。
  • @acid:不。模板允许您编写与类型无关的代码,但仍然必须编写代码。确实,如果您尝试这样做,那么您似乎出于错误的原因使用了嵌套类。在 C++ 中,它们几乎总是一个坏主意,除非嵌套类型完全用于访问外部类型(例如标准容器和迭代器)。如果您想要外部类随行的东西,请改用继承(可能是私有继承)。
  • @acidzombie24: int 是一个类型,而不是一个对象。
  • 这个想法是自动神奇地传递变量所需的数据,而不是执行Foo::Bar<int> a,b,c,d; ctor: a(this), b(this)...,这可能会很烦人。
  • @acid:我们理解这个想法。但是,您尝试做的事情根本不会那样工作。
【解决方案2】:

问一个奇怪的问题,得到一个奇怪的答案(这是指肱骨,而不是在挖你):

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

看,没有构造函数!

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

不允许在类 bar 中使用构造函数(因此不能传入指向 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();

【讨论】:

    【解决方案3】:

    在 C++ 中,将一个类嵌套在另一个类中仅意味着 name 是嵌套的,而不是 instances 是嵌套的。换句话说,如果你有 A 类和 B 类:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多