Class member without a default constructor

后端 未结 3 1328
栀梦
栀梦 2020-12-07 02:16

Suppose I have a class A without a default constructor, a factory method factoryA that returns an object of type A, and a class B that has A as its member. I know that in th

相关标签:
3条回答
  • 2020-12-07 02:30

    It is not entirely clear to me why so if someone could explain that to me it would be great.

    For classes[*], the _a = factoryA(true); line calls _a.operator=(factoryA(true)). Calling a member function on _a requires _a to already be initialised. So if it weren't a compile-time error, it still wouldn't be valid.

    Also, what if the parameter to A's constructor needs to be computed inside of B's constructor, say by querying a database or something of that nature? Is there a way to use the setup below without providing A with a default constructor?

    As long as A has a copy or move constructor, you can initialise it with a function return value, and that function can do anything you want, even using different constructors for A depending on the arguments provided.

    class B {
    private:
      A _a;
      static A getA(int i);
    public:
      B(int j) : _a(getA(j)) {
      }
    };
    
    A B::getA(int j)
    {
      if (j > 0)
        return factoryA(true);
      else
        return factoryA(false);
    }
    

    [*] I know, there are exceptions.

    0 讨论(0)
  • 2020-12-07 02:33

    In this case it's better to use the pointer to A, i.e. A* _a, and then call A constructor wherever you want.

    0 讨论(0)
  • 2020-12-07 02:39

    Member objects are always initialized before entry into the body (the part between the curly braces) of the constructor. If you don't mention a member in the initializer list, it gets default constructed. So mention it!

    B::B(int j) : _a(factoryA(0 < j)) { };
    

    This calls the function factoryA with the argument value true if j is greater than 0 and false otherwise, and initializes the member _a with the value returned by that call.

    0 讨论(0)
提交回复
热议问题