首页 > 解决方案 > 实例化后可以构造吗?避免空构造函数

问题描述

我有一个类,它的成员属性由在别处定义的对象组成。在下面的代码中,A包含一个公共属性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);
        }
};

这确实可以编译,因为属性是在实例化之后设置的。

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

标签: c++classoopinstantiation

解决方案


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

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


推荐阅读