我有一个类,其构造函数如下所示:
Chunker::Chunker(int chunkSizeX, int chunkSizeY){
chunkX = chunkSizeX;
chunkY = chunkSizeY;
}
我希望用户能够让chunkSizeY
或chunkSizeX
拥有默认值(需要Chunker
计算)。
I.E所以他们可能会传递'AUTO'关键字或其他东西,以便构造函数知道。
我可以这样做:
Chunker::Chunker(int chunkSizeX, char chunkSizeY)
Chunker::Chunker(char chunkSizeX, int chunkSizeY)
Chunker::Chunker(char chunkSizeX, char chunkSizeY)
因此,如果它获得一个或两个值的char
,它知道自动计算它们吗?
我确信他们必须是一个我不知道的更好/标准的方式......?
答案 0 :(得分:5)
您可以使用特殊的空类来提供帮助:
struct Default {};
class Chunker
{
public:
Chunker(int x, int y) : chunkX(x), chunkY(y) {}
Chunker(Default, int y) : chunkX(42), chunkY(y) {}
Chunker(int x, int Default) : chunkX(x), chunkY(42) {}
private:
int chunkX;
int chunkY;
};
用法:
Chunker c(1, 2);
Chunker cx(3, Default{});
Chunker cy(Default{}, 4);
或使用"静态构建器"
class Chunker
{
public:
Chunker(int x, int y) : chunkX(x), chunkY(y) {}
static Chunker FromX(int x) { return Chunker(x, 42); }
static Chunker FromY(int y) { return Chunker(42, y); }
private:
int chunkX;
int chunkY;
};
用法:
Chunker c(1, 2);
Chunker cx = Chunker::FromX(3);
Chunker cy = Chunker::FromY(4);
答案 1 :(得分:4)
只需编写一个帮助类来构建Chunker
,例如:
class MakeChunker {
void setX(int x) { ...
void setY(int y) { ...
Chunker make()
答案 2 :(得分:2)
我建议使用Boost.Optional,它会给你这样的代码:
void function(optional<int> x, optional<int> y) {
if (x) {
// use *x
}
if (y) {
// use *y
}
}
也就是说,对于构造函数的情况,在类中添加静态工厂函数有时是个好主意:
class Chunker {
static Chunker create_with_x(int x) {
...
}
static Chunker create_with_y(int y) {
...
}
};
答案 3 :(得分:0)
只要具有不同的签名,就可以在C ++中指定多个构造函数,并且编译器将为每个调用选择适当的构造函数。
所以你可以完美地做到:
在 Chunker.cpp
中Chunker::Chunker(int chunkSizeX, char chunkSizeY) {...} // First constructor
Chunker::Chunker(char chunkSizeX, int chunkSizeY) {...} // Second constructor
Chunker::Chunker(char chunkSizeX, char chunkSizeY) {...} // Third constructor
然后在你的程序的另一个文件中:
Chunker::chunker chunker1 = Chunker::Chunker(1, 'b') // First constructor is used
Chunker::chunker chunker2 = Chunker::Chunker('a', 2) // Second constructor is used
Chunker::chunker chunker3 = Chunker::Chunker('a', 'b') // Third constructor is used