2009-02-24 165 views
1

如果参数的类型不同,我可以使用不同的方式创建一个构造函数吗?即int或float。C++中一个类的构造函数中的不同参数

比方说,如果我这样做,新的对象(3) 构造各项指标在填满了3数组

比方说,如果我这样做,新的对象(3.5) 构造填充使用数组对于每一个指标

指数+ 3.5比方说,如果我这样做,新的对象() 构造各项指标

有没有办法只有一个构造函数来实现这个填充在用0.0阵列?或者我需要三种不同的构造函数?

谢谢。

回答

0

您需要3个不同的构造函数。

0

需要多个构造函数,每个不同的参数类型一个。

0

您将需要三个不同的构造函数(重载它们)或一个具有一些具有默认值的属性。

这可以实现,但是我会建议使用3个不同的构造函数代码清晰度等

1

如果你只关心内建类型,你可以采取型促销活动和默认值的优势:

struct Object 
{ 
    Object(double value = 0.0) 
    { 
     // do that thing you do 
    } 
}; 
+0

对,但是如何根据传入的内容完成3种不同的操作?他们都会上升一倍,所以你不知道该做哪一个。 – 2009-02-24 08:00:27

+0

您可以将默认值设置为默认值,然后检查三个值中的哪一个(三个示例)已传递给构造函数。正如我在答复中所说的那样,你可以做到这一点,但这会很难看,也不清楚。 – 2009-02-24 08:04:19

3

你可以用一个构造函数来完成,但它会像地狱一样丑陋。 提供了3种构造函数方法,因为它分离了用法并简化了代码。

6

当然你可以有许多构造函数!重载构造函数的工作方式与任何函数/成员相同。

请记住,有时编译器可以隐式地调用一个你不想被调用的构造函数 - 通过自动转换参数。

您可以将关键字explicit添加到构造函数声明中禁止任何自动转换。

0

不但你需要三个不同的构造函数,你需要三个不同的构造函数。它将保持代码更清晰,更易于理解,维护和单元测试。

1

只要传递的参数总是相同的类型,您可以使用一个构造函数逃脱,否则您需要几个。

看起来好像最明显的解决方案是在对象构造函数中插入switch语句。

例子:

public Object(int num) 
{ 
switch (num) 
{ 
case 1: array[i] = num; 
break 
case 2: array[i] = num * 2; 
} 

} 
0

,因为他们做同样的事情你可以因素的行为Object()Object(3)。只要写你的构造是这样的:

class Object { 
    // fills an array with n at every index 
    Object(int n = 0) { ... } 
}; 

的问题是,用一个浮点数(3.5中的例子)具有构造要分开,就像这样:

class Object { 
    // fills an array with n at every index 
    Object(int n = 0) { ... } // handles Object() AND Object(3) 

    // fills an array with index + n at every index 
    Object(float n) { ... } // handles Object(3.5) 
}; 
1

它通常是对于一个纯粹基于参数类型的构造函数具有这种不同行为的坏主意,尤其是对于可以在对方之间隐式转换的内置类型。尽管如此,纯粹作为一种编程练习,可以使用一个构造函数来完成此操作,但是您必须使用一个代理类,并通过类型之间的隐式转换进行区分以实现您想要的功能。作为预罐装解决方案,boost :: variant将符合要求。您可能不认为这符合单个构造函数的要求,因为它依赖于第二个类的多个构造函数(或构造函数模板)。

class Object 
{ 
public: 
     Object(const boost::variant< int, double >& val = 0) 
     { 
       switch(val.which()) 
       { 
       case 0: 
         // TODO: Fill array with val 
         break; 
       case 1: 
         // TODO: fill array with val + index 
         break; 
       } 
     } 

// TODO: Add array member 
}; 
0

使用3种不同的构造函数,因为逻辑的不同取决于参数的类型。此外,请注意编译器完成的类型升级。另外,当代码执行时,您可能会得到惊喜。

2

这听起来像是你的维修噩梦。我建议你使用命名的构造函数成语来代替:

class Object 
{ 
public: 
    // Sets all elements to 0. 
    Object(); 

    // Sets all elements to value. 
    static Object Fill(double value); 

    // Sets all elements to the previous + delta, beginning at start. 
    static Object Accumulate(double start, double delta); 
}; 
相关问题