我想知道这样的事情是可能的。也许使用模板和技巧? 现在我强制执行的唯一规则是你不允许在类栏中使用构造函数(所以你不能传入一个引用或指向foo的指针也不能传递给它。)
class Foo{
int a;
public:
struct Bar{
int barme(){ return a; }
};
};
我知道一个问题是bar如何知道要使用哪个foo实例?我不知道但是我想要一个foo来拥有很多类别的Bar和多一个foo,每个都会有一个以上的吧。
我确定我在某个地方看到了一个技巧(也许是用不同的语言),但我不知道在哪里。我确实记得使用编译时const的模板但是在这种情况下foo不会是编译时间,尽管它的ptr / ref可能是
答案 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
的实例。