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