Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何启用从一个类到另一个类的转换?_C++ - Fatal编程技术网

C++ 如何启用从一个类到另一个类的转换?

C++ 如何启用从一个类到另一个类的转换?,c++,C++,我想允许从a到B的转换: A{4}; B=a; 以下是设置: A类 { 公众: 显式A(int值) :成员{value} { } 私人: 国际会员; }; B类:公共A { 公众: 显式B(A) :A{A} { } }; int main() { A A{4}; B=a; } 我可能会删除B的构造函数中的explicit修饰符,但是,Clang Tidy抱怨单参数构造函数必须标记为explicit,以避免无意的隐式转换。 我想要的是从A到B的有意转换,但我不知所措-在A中定义转换运算符似乎很

我想允许从a到B的转换:

A{4};
B=a;
以下是设置:

A类
{
公众:
显式A(int值)
:成员{value}
{
}
私人:
国际会员;
};
B类:公共A
{
公众:
显式B(A)
:A{A}
{
}
};
int main()
{
A A{4};
B=a;
}
我可能会删除
B
的构造函数中的
explicit
修饰符,但是,Clang Tidy抱怨单参数构造函数必须标记为explicit,以避免无意的隐式转换。 我想要的是从
A
B
的有意转换,但我不知所措-在
A
中定义转换运算符似乎很奇怪,因为我必须向前声明B及其构造函数,我甚至不知道这是否可能,因为
B
继承
A

如何启用此转换

ClangTidy抱怨单参数构造函数必须标记为显式,以避免无意的隐式转换

坦率地说,我强烈怀疑这是clang tidy所说的(“必须是”)。未声明为显式的单参数构造函数是。它们可能是邪恶的,因为在某种程度上它们禁用了类型安全性

您可以启用隐式转换,但也将启用所有不需要的隐式转换。考虑一个

void foo(B);
如果没有隐式转换,将
A
传递到
foo
是一个错误。这是件好事,
foo
想要的是
B
而不是
a
。隐式转换不会被注意到,并且可以隐藏代码中的逻辑错误。这就是为什么单参数构造函数应该声明为显式的,除非您真的希望它们能够实现所有的起伏


TL;DR:ClangTidys的信息只是一个建议。隐式转换没有什么错,只要您知道其后果。考虑如果你想要它,然后忽略Calang-TyDy。< /P> <代码>但是,Clang Tidy抱怨< /Cord> >所以你想让我们告诉你忽略CLAN-TYDY?代码>我想要的是有意的转换然后是显式的-
bb=B(a)这与我想做的恰恰相反。我想告诉编译器,我明确地希望允许从B到A的转换!编译器不在乎。Clang tidy不是编译器。
显式
构造函数不使用语言设计的复制初始化(
=
)。但是你可以做
bb{a}
B(a)
.clangtidy告诉您,允许像这样从一个类隐式转换到另一个类通常不是一个好主意。如果这正是你想要的,请不要理会叮当声。谢谢你的回答!这确实是叮当·蒂迪所说的。问题消息副本:
clangtidy:必须将单参数构造函数标记为显式以避免无意的隐式转换
要消除clangtidy建议,可以将函数声明行更改为:
B(aa)//NOLINT(谷歌显式构造函数)
@glennib ok,我从来没有用过叮当声,所以我不确定。虽然如果它真的说“必须”,那么我希望在他们的文档中的某个地方,他们提到隐式转换是不允许的,因为事实上,只有叮当声才能使它成为“必须”,而一般来说,它只是一个“应该”