2011-07-28 48 views
3

我试图做类似如下:C++中函数声明中成员变量的引用?

class FOO { 
void bar(int& var = m_var) { 
    // .... 
} 
int m_var; 
}; 

为什么没有这个编译?他们为什么不把它编入语言?有什么办法模仿这种行为吗?

+0

可能重复http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-nonstatic-member-function) – Nawaz

回答

6

这是不允许的,因为m_var是一个成员变量,需要通过该对象进行访问。如果m_var是该类的静态成员,

简单的解决方法是调用具有相同的名称或通过bar()另一个的成员函数(这是一个成员函数&访问m_var)一个重载函数并传递m_var通过reference.It一个参数将要相同的效果实现。

+0

@AIs - 这很容易混淆,因为你可以从函数内部访问m_var。例如void bar(int&var){cout << m_var; }。看起来像这是允许的,因为bar是一个非静态成员函数,只能使用FOO的对象调用。同样的推理也适用于上述定义,对吗?那么,编译器为什么会抱怨直接访问非静态成员。 – cppcoder

+0

@srikrish:当你访问一个成员变量时,在非静态成员函数内部说'membervar',它实际上是在执行'this-> membervar'。这将作为隐式参数传递给每个成员函数。 –

+0

@AIs - 为什么编译器不能在函数参数中访问m_bar。使用FOO的对象调用了一个条,所以这个指针是可用的。正如Alexandre指出的那样,它看起来像一个编译器限制。虽然,我在想这种用法的目的是什么? – cppcoder

4

我同意,这是语言的限制。它可以在没有困难的情况下实施到编译器(我的愚见)。

如果你想这种行为,你必须写:

class FOO 
{ 
    void bar(int& var) { ... } 
    void bar() { this->bar(m_var); } 

    int m_var; 
}; 

和额外的函数调用会被任何半体面的编译器内联,如果你担心。

0

一种解决方案是具有静态变量,这将作为占位符:

class FOO 
    { 
    private: 
     static int _ph_m_var; 
     void bar(int& var = _ph_var) 
     { 
       if(&var == &_ph_var) { // Default } 
     } 
}; 
0

申报m_var是一个静态常量。它会编译并运行。

静态const int的m_var应该做的伎俩

[非静态成员作为非静态成员函数的默认参数(的