如何在C++函数中为结构体分配默认值?

6

我有一个结构:

typedef struct {
   double x,y,z;
} XYZ;

I want to define a function like this:

double CalcDisparity(XYZ objposition, 
                     XYZ eyeposition, 
                     double InterOccularDistance = 65.0)

但是我似乎找不到一种方法来为eyeposition分配默认值。在C++中我该怎么做?


3
@drknexus,C++ 中的结构体(struct)与类(class)基本相同,不同之处在于结构体的成员默认情况下是公共的,而类的成员默认情况下是私有的。结构体可以拥有构造函数、析构函数、方法,基本上和类一样。如果你提到的是 C 语言,则它们又有所不同,所以你需要明确指出你所讨论的语言。 - Glen
这是C++,因此我已经编辑了问题和标签,将C从问题中删除。 - Jonathan Leffler
1
C语言中根本没有默认参数值。不要将C语言和C++混淆,它们非常不同。 - Nick T
1
@diverscuba23:我认为这只能是C++,因为C没有默认参数。 - Dan Moulding
很抱歉,这是C++。老实说,我在编程方面摸索不定,所以语言之间的区别对我来说并不明显。 - russellpierce
@Dan 是的,我只是想确认我完全理解了问题。以前我曾经假设过类似的部分,并且给出了错误的信息回答问题... 之后变得非常谨慎... - diverscuba23
4个回答

11
struct XYZ{
    XYZ( double _x, double _y, double _z ) : x(_x), y(_y),z(_z){}
    XYZ() : x(0.0), y(42.0), z(0.0){}

    double x, y, z;
};

这样我现在有了一个默认构造函数。然后你可以像这样调用它:

double CalcDisparity( XYZ objposition = XYZ(),
                      XYZ eyeposition = XYZ(),
                      double interOccularDistance = 65.0 )

但有一个小技巧:你只能为第1个和第3个参数设置默认值。还有一件事情:C是一种语言,C++是另一种语言。


如果你定义了额外的构造函数,比如:struct XYZ { XYZ(double _x, double _z) : x(_x), y(42.0), z(_z) }; double CalcDisparity( XYZ objposition = XYZ(), XYZ eyeposition = XYZ(1.0, 2.0), double interOccularDistance = 65.0 );,那么你就能够这样做。 - Remy Lebeau

2
C 中,函数参数不能有默认值(不知道 C++ 是否可以)。
C 中,你可以传递一个(某种方式)无效的值,检查该无效值并使用另一个有效值。
int foo(int n) {
  if (n == -1) { /* -1 is invalid */
    n = 42;      /* use 42 instead */
  }
  /* ... */
}

当回答这个问题时,它被标记为“C”;但是由于C不支持参数的默认值,因此该标记已被删除。 - Jonathan Leffler
C++支持默认参数值。 - andand

1
  1. 您可以编写一个工厂函数来创建XYZ对象,并将该函数调用作为默认值。

  2. 您可以将NULL设置为默认值,然后在函数中检查参数是否为NULL,如果是,则创建一个默认的XYZ对象。

  3. 创建一个全局XYZ对象并将其分配为默认值。

  4. 如果您不介意使用C++而不是纯C,请将XYZ定义为一个带有构造函数的类。

这些都是可以编译和工作的方法,但有些可能不是良好的编码实践。


如果他正在使用C ++,那么他可以将其保留为结构体,但是要给它一个构造函数。 - Glen

-1

你可以将最后一个解决方案与我的解决方案的一部分结合起来。你可以实现一个实例计数器。如果这个计数器为0,那么你就初始化值。但是计数器永远不会达到0以外的任何值...

也许这会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接