我想创建一个数组,其中每个元素都可以从int
或float
设置(这些特殊类型只是一个示例)。
所以我继续做了一个有两个构造函数的类:
class ScaledNumber {
private:
int scaled_number;
public:
ScaledNumber(int number);
ScaledNumber(float number);
};
ScaledNumber::ScaledNumber(int number) {
scaled_number = number * 1000;
}
ScaledNumber::ScaledNumber(float number) {
scaled_number = (int)(number * 1000);
}
当我使用这个类的单个变量时,这很好用。但现在我想创建一个这样的对象数组。我必须添加第三个构造函数来使声明工作:
ScaledNumber::ScaledNumber() {}
ScaledNumber numbers[5];
现在,如果我想重新分配例如numbers[3]
,我可以以某种方式使用构造函数,还是必须添加set()
方法或类似的东西?
答案 0 :(得分:2)
我可以以某种方式使用构造函数
您可以简单地使用:
ScaledNumber numbers[5];
numbers[0] = 20;
numbers[1] = 30.2f;
编译器在进行赋值之前将使用适当的构造函数。最后两行由编译器翻译为:
numbers[0] = ScaledNumber(20);
numbers[1] = ScaledNumber(30.2f);
答案 1 :(得分:0)
无论如何,ScaledNumber numbers[5];
有什么意义?您之前不需要ScaledNumber number;
来使单个对象起作用,大概是因为创建这样的半就绪对象没有意义,那么为什么需要它来存放五个对象呢?
您可以像这样初始化数组中的对象:
#include <iostream>
class ScaledNumber {
private:
int scaled_number;
public:
ScaledNumber(int number);
ScaledNumber(double number);
};
ScaledNumber::ScaledNumber(int number) : scaled_number(number * 1000) {
std::cout << "int\n";
}
ScaledNumber::ScaledNumber(double number) : scaled_number(static_cast<int>(number * 1000)) {
std::cout << "double\n";
}
int main() {
ScaledNumber numbers[] = { 1, 2.2, 3, 4.4, 5 };
}
输出:
int
double
int
double
int
请注意,我还做了四项改进:我将float
替换为double
(语言的默认浮点类型),将C风格转换为static_cast
,I将初始化列表添加到构造函数中,并使编译器计算数组中的元素。