更改静态成员对象的值

时间:2016-01-22 16:28:22

标签: java c++

来自Java,我已经学会了某些方法来做一些有点适用于C ++的方法,但似乎并非完全如此。在Java中,我可以使用

class A {
    public static A instance;
    public void foo() {
        System.out.println("Hello, world!");
    }
}

class B {
    public static void main(String[] args) {
        A.instance = new A();
        A.instance.foo();
    }
}

但是在C ++中,这似乎要么不可能,要么在某种程度上有所不同。以下是我认为在C ++中可以达到同样效果的内容:

class A {
    public:
        static A instance;
        void foo();
};

void A::foo() {
    cout << "Hello, world!";
}

int main() {
    A::instance();
    A::instance.foo();
}

但是这会在A::instance()产生“错误:呼叫不匹配”。在实际代码中,构造函数具有参数,如果这会产生影响。我听说过一个静态成员必须在程序一开始就被初始化,但只有在我有一些关于它将存储的对象的信息时才能创建实例。一旦获得所有必需信息,如何正确设置此值?

3 个答案:

答案 0 :(得分:4)

您必须定义A实例:

class A {
    public:
        static A instance;
        void foo();
};

// call the constructor here, the compiler will know what to do with it.
A A::instance = A();

void A::foo() {
    cout << "Hello, world!";
}

int main() {
    A::instance.foo();
}

答案 1 :(得分:3)

&#39;实例&#39;是一个变量。您需要在main函数之外初始化它。 这应该有效:

class A {
public:
    static A instance;
    void foo();
};

void A::foo() {
    cout << "Hello, world!";
}

A A::instance;

int main() {
    A::instance.foo();
    return 0;
}

答案 2 :(得分:0)

您的意见澄清了您想在输入instance后构建main。在这种情况下,您需要使instance成为(智能)指针,而不是实际对象。所以:

class A {
    public:
        static std::unique_ptr<A> instance;
        void foo();
};

// Construct the pointer object.
A A::instance = {};

void A::foo() {
    cout << "Hello, world!";
}

int main() {
    A::instance = std::make_unique<A>();  // Arguments here.
    A::instance->foo();     // Use -> not .
}