实例化后可以构造吗?避免空构造函数

Can you construct after instantiation? Avoiding empty constructor

我有一个 class,它的成员属性由别处定义的对象组成。在下面的代码中,A 包含一个 public 属性 var,它是一个 B:

class B {
    public:
    int x, y;
    std::vector<int> z;
        B(int a, int b, std::vector<int> c) {
            x = a; y = b; z = c;
        }
};

class A {
    public:
        B var;
        A(int i, int j) {
            std::vector<int> someVector;
            B(i, j, someVector);
        }
};

int main() {
    A foo(5, 3);
    return 0;
}

这(显然)无法编译,因为 var 是在 A 的实例化时实例化的,为时已晚,无法构建。

我能做类似事情的最好方法是修改一些代码:

class B {
    public:
    int x, y;
    std::vector<int> z;
        B() {}
        void setAttributes(int a, int b, std::vector<int> c) {
            x = a; y = b; z = c;
        }
};

class A {
    public:
        B var;
        A(int i, int j) {
            std::vector<int> someVector;
            B.setAttributes(i, j, someVector);
        }
};

这会编译,因为属性是在实例化后设置的。

但是有没有办法更接近第一个代码片段?

A(int i, int j) : var(i, j, {}) {}

此外,在您的代码中 B(i, j, someVector); 不会 初始化成员变量 var,并且 B.setAttributes(i, j, someVector); 根本不会编译。

如果你不能定义一个有用的默认构造函数并且不想要丑陋的两步初始化,我想没有办法绕过指向 B 的指针。像

#include <memory>

class B {
    public:
        int x, y;
        std::vector<int> z;

        B(int a, int b, std::vector<int> c) {
            x = a; y = b; z = c;
        }
};

class A {
    public:
        std::unique_ptr<B> var;
        A() {
            std::vector<int> someVector;
            var = std::make_unique<B>(5, 2, someVector);
        }
};

int main() {
    A foo();
    return 0;
}

应该可以解决问题。