隐式转换的多参数

时间:2011-09-08 03:22:54

标签: c++

对于具有多个参数的构造函数...

例如:

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”作为输出。

4 个答案:

答案 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”在同一对象的所有实例之间共享,请考虑保存静态变量。