2012-03-06 87 views
28

的像这样的代码:无效使用非静态数据成员

class foo { 
    protected: 
    int a; 
    public: 
    class bar { 
     public: 
     int getA() {return a;} // ERROR 
    }; 
    foo() 
     : a (p->param) 
}; 

我得到这个错误:

invalid use of non-static data member 'foo::a' 

目前的变量a中的foo构造函数初始化。

,如果我让静态的,那么它说:

error: 'int foo::a' is a static data member; it can only be initialized at its definition 

但是我想在构造函数的值传递给a。 然后是什么解决方案?

+5

为什么不移动getA()到foo? – Eduardo 2012-03-06 19:18:16

+4

你的问题中的代码有几个问题,使它不清楚你真的想做什么。请编辑你的问题,以表明你的总体目标是什么。 – 2012-03-06 19:32:42

回答

25

在C++做什么不同,(比如)Java中,一个嵌套类的实例本质上并不属于封闭类的任何实例。因此bar::getA没有任何foo的具体实例,它可以返回a。我猜你想要的东西是一样的东西:

class bar { 
     private: 
     foo * const owner; 
     public: 
     bar(foo & owner) : owner(&owner) { } 
     int getA() {return owner->a;} 
    }; 

但即使是这样,你可能不得不做出一些改变,因为在C++ 11之前,C++的版本,不像(再次,说的)Java,一个嵌套类没有特殊的访问其封闭类,所以它不能看到protected成员a。这将取决于您的编译器版本。 (HAT尖肯韦恩VanderLinde用于指出C++ 11已经改变这一点。)

+0

'a'的类型是'int' 。你为什么写'foo *'? – mahmood 2012-03-06 19:27:04

+0

我知道'a'是'int'类型的。我不确定我的答案的哪一部分在这方面让你困惑。 : -/ – ruakh 2012-03-06 19:28:15

+0

它表示'错误:从'foo *'无效转换为'int'[-fpermissive]' – mahmood 2012-03-06 19:28:40

3

在C++中,嵌套类未连接到外部类的任何实例。如果您想bar访问foo的非静态成员,则bar需要访问foo的实例。也许是这样的:

class bar { 
    public: 
    int getA(foo & f) {return foo.a;} 
}; 

或许

class bar { 
    private: 
    foo & f; 

    public: 
    bar(foo & g) 
    : f(g) 
    { 
    } 

    int getA() { return f.a; } 
}; 

在任何情况下,你需要明确确保您可以访问的foo一个实例。

0

您尝试访问另一个类的私人成员。 bar-class在foo-class中声明的事实意味着bar仅在foo class中可见,但仍然是其他类。

什么是p-> param?

事实上,目前尚不清楚你想要做

+0

当我把a作为公众时,没有什么区别 – mahmood 2012-03-06 19:18:37

+1

@mahmood在bar-class内* a *完全不存在,它是foo-class的一部分。你想达到什么目的? – Alecs 2012-03-06 19:20:33

+0

'p-> param'是从其他地方读取值并将其传递给'a'的东西。例如,在一个文件中,我写了'2'。该代码读取并传递给'a' – mahmood 2012-03-06 19:23:20

2

嵌套类不知道外部类,和protected没有帮助。您必须将某些实际引用传递给嵌套类类型的对象。你可以存储foo*,但也许到整数的引用是不够的:

class Outer 
{ 
    int n; 

public: 
    class Inner 
    { 
     int & a; 
    public: 
     Inner(int & b) : a(b) { } 
     int & get() { return a; } 
    }; 

    // ... for example: 

    Inner inn; 
    Outer() : inn(n) { } 
}; 

现在你可以实例化内部类,如Inner i(n);并调用i.get()

+0

什么是'b'呢? – mahmood 2012-03-06 19:19:40

+0

@mahmood:'b'是构造函数的本地参数。 – 2012-03-06 19:20:08

相关问题