我在代码中看到了一个函数声明,如下所示
void error(char const *msg, bool showKind = true, bool exit);
Run Code Online (Sandbox Code Playgroud)
我首先想到这是一个错误,因为你不能在函数中间有默认参数,但是编译器接受了这个声明.谁看过这个吗?我正在使用GCC4.5.这是GCC扩展吗?
奇怪的是,如果我把它放在一个单独的文件中并尝试编译,GCC会拒绝它.我已经仔细检查了所有内容,包括使用的编译器选项.
我想为其中一个成员函数选择一个参数.如果没有提供参数,它将使用成员变量.
但是,当我尝试编译它时,它显示" 错误:无效使用非静态数据成员'Object :: initPos' "
只是为了隔离问题,我尝试默认一个int类型,它编译得很好.我想知道我的代码有什么问题,以及如何使用成员函数作为默认值.
谢谢您的帮助!
Object.h
class Object
{
public:
...
void MoveTo(double speed, Point position);
protected:
Point initPos;
Point currPos;
};
Run Code Online (Sandbox Code Playgroud)
Object.c
void Object::MoveTo(double speed, Point position = initPos)
{
currPos = postion;
}
Run Code Online (Sandbox Code Playgroud)
Point.h
class Point
{
...
private:
double x;
double y;
double z;
};
Run Code Online (Sandbox Code Playgroud) 可能重复:
非静态成员作为非静态成员函数的默认参数
如果我错了,请纠正我,但我认为默认参数的工作方式如下:
当编译器看到函数调用时,它开始将参数压入堆栈.当参数耗尽时,它将开始将默认值推送到堆栈,直到填满所有必需参数(我知道这是一个简化,因为参数实际上是从右向左推送的,所以它将从默认值开始,但是想法是一样的).
如果这是真的,为什么不能将成员变量用作默认值?在我看来,由于编译器像往常一样在呼叫站点推送它们,它应该能够解决它们就好了!
编辑由于答案似乎被我的问题误解了,让我澄清一下.我知道情况就是这样,而且我知道该语言允许和不允许的内容.我的问题是为什么语言设计师选择不允许这样做,因为它似乎自然而然地起作用.
LinkedInteger accessElement(int index, LinkedInteger *startElement=&DataArray[0]){ // Starting at *startElement*, returns the element which is at the index of *startElement+index
LinkedInteger NullElement;
if (index<0){
cout << "Index degeri sifirdan buyuk olmalidir" << endl;
NullElement.value=0;
NullElement.nextPtr=0;
return NullElement;
}
for (int i=0; i<index; i++){
if (startElement->nextPtr == NULL){ // Last elements index is null.
cout << " Erismeye calistiginiz eleman dizi sinirlarinin disindadir " << endl;
NullElement.value=0;
NullElement.nextPtr=0;
return NullElement;}
else {
startElement=startElement->nextPtr;
}
}
return *startElement;
} …Run Code Online (Sandbox Code Playgroud) 好的,如果我没有在这里看到一些非常简单的东西或忘记C++的一些基本规则,我提前道歉但我不确定为什么这不能按预期工作.
这是一个我无法工作的代码示例
class Foo
{
private:
Bar *ptrBar;
public:
void doSomething(int x, Bar *p = ptrBar);
}
Run Code Online (Sandbox Code Playgroud)
编译器遇到此函数的默认参数问题.有什么理由说这不起作用.
基本上doSomething会对Bar对象进行一些操作,我希望它是ptrBar默认指向的那个.除非忘记什么,否则一切似乎都是合理的?
可能重复:
非静态成员作为非静态成员函数的默认参数
好.所以我在理解如何完成看似简单的任务时遇到了问题......这就是我想要完成的事情:
#include <iostream>
using namespace std;
class A{
private:
int _x;
public:
A(int x){
_x = x;
}
void test(int x=_x){
cout << x << endl;
}
};
int main(){
A a(3);
a.test();
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨该int x=_x部分说error: invalid use of non-static data member A::_x
那么如何使用这样的默认参数呢?
谢谢.