场景是我有一个函数在我想初始化时调用参数化构造函数。所以我想做的就是在我想要的时候调用我选择的构造函数。但是当我使用A()
来调用默认构造函数时,它可以工作,但它不能与带有参数的构造函数一起工作,而是我遇到了错误。
错误1错误C2082:重新定义形式参数 ' TMP' c:\ users \ adnan \ documents \ visual studio 2012 \ projects \ project3 \ project3 \ source.cpp 12 1 Project3
class A
{
public:
int id;
void i(int tmp)
{
A(tmp);
}
A()
{
cout<<"default const"<<endl;
}
A(int id)
{
this->id = id;
}
};
int main()
{
A obj[2];
for(int i=0;i<2;i++)
{
obj[i].i(i*2);
}
cout<<"obj[0].id = "<<obj[0].id;
cout<<endl;
cout<<"obj[1].id = "<<obj[1].id;
cout<<endl;
system("pause");
return 0;
}
答案 0 :(得分:3)
在您的会员功能i
中,您试图像A
这样打电话给<{1}}:
void i(int tmp)
{
A(tmp);
}
实际上A(tmp)
声明了tmp
类型的变量A
。由于tmp
已在同一范围内声明为int
,因此编译器会抱怨。
如果您想要一个A
类型的变量并通过A::A(int)
c&r;来初始化它,那么您需要为该变量命名。 E.g:
A a(tmp);
答案 1 :(得分:1)
该行
A(tmp);
不调用构造函数,它声明一个名为“tmp”的A
实例 - 它相当于
A tmp;
由于形式参数被称为“tmp”,这是一个重新定义。
(尽管你可能期望,A tmp();
等同于A tmp;
- 寻找“最令人烦恼的解析”来了解更多信息。)
写作时“工作”的原因
A();
是它创建了一个匿名实例(与this
完全不同的一个),它立即被丢弃。
换句话说,该代码没有按照您的想法执行。
除了使用“placement new”之外,没有办法(在C ++ 03中)显式调用构造函数,除非你知道你在做什么,否则不应该这样做。
如果要延迟对象的“初始化”,直到构造它为止,请使用初始化函数:
class A
{
public:
int id;
void init(int tmp)
{
id = tmp;
}
A()
{
cout<<"default const"<<endl;
init(0); // Avoid accidental undefined behaviour.
}
A(int id)
{
init(id);
}
};
答案 2 :(得分:0)
涉及表达式语句的语法含糊不清 和声明:
我引用了C ++标准。
就在这段代码中
void i(int tmp)
{
A(tmp);
}
A(TMP);编译器将其视为等同于
的声明A tmp;
将构造函数调用与您可以编写的声明区分开来
void i(int tmp)
{
( A )( tmp );
}
在这种情况下(A)(tmp)是一个构造函数调用,虽然在这个语句中没有任何意义。