对于具有多个参数的构造函数...
例如:
class C {
public:
C(int a=1, int b=2){ cout << a << ", " << b << "\n"; }
}
int main(){
C a(10), b = 20;
}
output:
10, 2
20, 2
如何为第二个参数赋值?这样我就可以在不知道默认值的情况下获得“1,20”?或者是我必须始终为我可以使用后面的参数之前的参数赋值?
我如何隐式分配所有参数?如果我不能那样做,为什么?对于上面的例子(因为我是C ++的新手),我曾经以为我会把“10,20”作为输出。
答案 0 :(得分:2)
或者是我必须总是为我可以使用后面的参数之前的参数赋值?
是。否则,编译器应该如何知道哪个参数应该用于哪个参数?
但是,有很多方法可以实现这一目标。例如,
struct C {
enum { DefaultA = 1, DefaultB = 2 };
C(int a = DefaultA, int b = DefaultB) { /* ... */ }
};
C object(C::DefaultA, 20);
或者,如果你有很多参数有不同的“默认值:”
struct CParams {
int a, b;
CParams() : a(1), b(2) { }
};
struct C {
C(CParams x) { /* ... */ }
};
CParams params;
params.b = 20;
C object(params);
答案 1 :(得分:1)
C ++不支持命名参数。你必须指定第一个。
此外,main函数中的变量名b
与构造函数定义中的b
完全分开。命名暗示没有任何关系。
答案 2 :(得分:1)
我有同样的想法( Convienient C++ struct initialisation - 也许你在那里找到了你更喜欢的东西)前一段时间,但刚才,在阅读你的问题时,我想到了一条路实际上是完成了但这是一些额外的代码,所以问题仍然存在,如果它真的值得。我刚刚实现了它非常粗略,我并不为我的名字选择感到骄傲(我通常不使用_
但是已经很晚了)。无论如何,这就是你可以做到的:
#include <iostream>
struct C_members {
int a;
int b;
C_members(int _a, int _b) : a(_a), b(_b) {}
};
class C_init {
public:
virtual C_members get(C_members init) const {
return init;
}
};
class C_a : public C_init {
private:
int a;
public:
C_a(int _a) : a(_a) {}
C_members get(C_members init) const {
init.a = a;
return init;
}
};
class C_b : public C_init {
private:
int b;
public:
C_b(int _b) : b(_b) {}
C_members get(C_members init) const {
init.b = b;
return init;
}
};
class C : private C_members {
private:
static const C_members def;
public:
C(C_init const& ai = C_init(), C_init const& bi = C_init()) : C_members(ai.get(bi.get(def)).a, bi.get(ai.get(def)).b) {
std::cout << a << "," << b << std::endl;
}
};
const C_members C::def(1,2); // default values
// usage:
int main() {
C c1(C_b(77)); // 1,77
C c2(C_a(12)); // 12,2
C c3(C_b(5),C_a(6)); // 6,5
return 0;
}
有很多东西可以改进(使用模板(代码缩减)和get方法中的const引用),但你明白了。
作为一个额外的功能,你几乎已经实现了pimpl习惯用法(只需要很少的努力就可以将它扩展到实际的pimpl设计中)。
答案 3 :(得分:0)
通常在OOP中,每个对象实例都保存(并表示)一个状态。
所以最好的方法是定义一个访问器函数,如
void setB(int newBvalue);
并且还将b作为私人成员。
如果“b”在同一对象的所有实例之间共享,请考虑保存静态变量。