我试图做类似如下:C++中函数声明中成员变量的引用?
class FOO {
void bar(int& var = m_var) {
// ....
}
int m_var;
};
为什么没有这个编译?他们为什么不把它编入语言?有什么办法模仿这种行为吗?
我试图做类似如下:C++中函数声明中成员变量的引用?
class FOO {
void bar(int& var = m_var) {
// ....
}
int m_var;
};
为什么没有这个编译?他们为什么不把它编入语言?有什么办法模仿这种行为吗?
这是不允许的,因为m_var
是一个成员变量,需要通过该对象进行访问。如果m_var
是该类的静态成员,
简单的解决方法是调用具有相同的名称或通过bar()
另一个的成员函数(这是一个成员函数&访问m_var
)一个重载函数并传递m_var
通过reference.It一个参数将要相同的效果实现。
@AIs - 这很容易混淆,因为你可以从函数内部访问m_var。例如void bar(int&var){cout << m_var; }。看起来像这是允许的,因为bar是一个非静态成员函数,只能使用FOO的对象调用。同样的推理也适用于上述定义,对吗?那么,编译器为什么会抱怨直接访问非静态成员。 – cppcoder
@srikrish:当你访问一个成员变量时,在非静态成员函数内部说'membervar',它实际上是在执行'this-> membervar'。这将作为隐式参数传递给每个成员函数。 –
@AIs - 为什么编译器不能在函数参数中访问m_bar。使用FOO的对象调用了一个条,所以这个指针是可用的。正如Alexandre指出的那样,它看起来像一个编译器限制。虽然,我在想这种用法的目的是什么? – cppcoder
我同意,这是语言的限制。它可以在没有困难的情况下实施到编译器(我的愚见)。
如果你想这种行为,你必须写:
class FOO
{
void bar(int& var) { ... }
void bar() { this->bar(m_var); }
int m_var;
};
和额外的函数调用会被任何半体面的编译器内联,如果你担心。
一种解决方案是具有静态变量,这将作为占位符:
class FOO
{
private:
static int _ph_m_var;
void bar(int& var = _ph_var)
{
if(&var == &_ph_var) { // Default }
}
};
申报m_var是一个静态常量。它会编译并运行。
静态const int的m_var应该做的伎俩
[非静态成员作为非静态成员函数的默认参数(的
可能重复http://stackoverflow.com/questions/4539406/nonstatic-member-as- a-default-argument-of-nonstatic-member-function) – Nawaz