缺少第一个构造函数参数
Missing the First Constructor Parameter
我有一个带有以下默认构造函数的类对象:
Point( double x = 0, double y = 0 );
如果我创建:
Point myPoint();
我会用(0, 0)
得到一分。如果我创建:
Point mySecondPoint(14);
我会用(14, 0)
得到一分。
但原因是:
Point myThirdPoint(, 10) //invalid
没有给我一点CCD_ 3。我应该如何编码第二个参数而不是第一个参数的可能性?
与其他几种语言不同,C++
要求在提供的参数之前提供所有默认参数。
从8.3.6默认参数[dcl.fct.Default]
如果在参数声明中指定了初始值设定项子句,则initializer子句用作默认参数。默认参数将在缺少尾随参数的调用中使用。
因此,如果一个函数有5个参数,其中3个是默认参数:
- 默认值3必须是最后3个参数
- 您可以使用前2个参数、前3个参数、后4个参数或全部5个参数调用函数
我应该如何为具有第二个参数的可能性进行编码,但是不是第一个?
在我看来,您的构造函数接口不是很好。在这种情况下,我更喜欢只有两个构造函数,默认情况下没有任何参数,一个有两个参数。若只想给出一个参数,那个么必须自己指定另一个参数的默认值。
即
Point();
Point(double x, double y);
或者你应该使用一些功能来创建一个新的点
Point CreateWithY(double y)
{
return Point(0.0, y);
}
并将其用作
Point p = CreateWithY(42.0); // Creates (0.0, 42.0)
不是答案的一部分,而是:
Point myPoint();
声明了一个函数myPoint,该函数不接受任何参数并返回类型为Point
的对象。您打算使用的可能是:
Point myPoint;
点myThirdPoint(,10)//无效
正如其他人所说,C++不支持这种语法。
我应该如何编码第二个参数而不是第一个参数的可能性?
首先,您应该考虑是否真的应该这样做。我不知道是否有更优雅的方法来实现这一点,但你可以引入新的类型并依赖重载注意,我并不是建议你真的应该走这条路,只是为了说明。
struct X
{
X(double v = 0.0) : mValue(v) {}
operator double() const { return mValue; }
private:
double mValue;
};
struct Y
{
Y(double v = 0.0) : mValue(v) {}
operator double() const { return mValue; }
private:
double mValue;
};
class Point
{
public:
Point() : mX(0.0), mY(0.0) {}
Point(X x) : mX(x), mY(0.0) {}
Point(Y y) : mX(0.0), mY(y) {}
Point(X x, Y y) : mX(x), mY(y) {}
private:
double mX;
double mY;
};
int main()
{
Point p1;
Point p2(X(1));
Point p3(Y(2));
Point p4(X(3), Y(4));
return 0;
}
因为C++有一些严格的语法规则。从这个角度来看,你的例子根本不正确。在声明默认参数时,请遵循以下规则:您希望更改频率最低的默认参数应该是最右边的默认参数,因为C++要求在您希望将其值从默认值更改为默认值之前指定所有参数。
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?