问题描述
|
我想知道这样的事情是否可能。也许使用模板和技巧?
我现在要强制执行的唯一规则是,您不允许在类栏中使用构造函数(因此,您不能将引用或指针传递给foo或a)。
class Foo{
int a;
public:
struct Bar{
int barme(){ return a; }
};
};
我知道一个问题是bar如何知道要使用哪个foo实例?我不知道,但我希望foo具有许多Bar类,然后再有一个foo,而每个foo都将具有一个以上的bar。
我确定我在某个地方(也许用另一种语言)看到了一个把戏,但我不知道在哪里。我确实记得使用编译时间const的模板,但是在这种情况下foo不会是编译时间,尽管它的ptr / ref可能是
解决方法
在C ++中,嵌套类只是类。它与Java不同,在Java中,嵌套类附带了父类的实例。因此,不可能做到这一点。您必须传递
Foo
的实例才能在Bar
内进行操作。 (例如,std::vector::iterator
不带有std::vector
,它是一个完全独立的类型)
, 提出一个怪异的问题,得到一个怪异的答案(这本来是卑鄙的态度,而不是对您的挑剔):
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();
, 在C ++中,将一个类嵌套在另一个类中仅意味着名称被嵌套,而不意味着实例被嵌套。换句话说,如果您有A类和B类,例如:
class A {
class B {
// whatever
};
};
然后,嵌套在A内的B仅影响所涉及名称的可见性,而不影响如何创建二者的实例-例如,您可以创建A::B
,而不必创建A
实例。