2016-01-22 117 views
0

來自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

實例是一個對象,而不是一個可調用的方法。你是否想要創建一個實例方法:A&instance(){static一個myinstance;返回myinstance;}? –

+0

您正在調用'A :: instance();'作爲函數,但它顯然不是。 –

+0

@AlgirdasPreidžius這是我看到一個對象初始化的唯一方法('obj(3,「hi」);')。我知道這不是一個函數,但我的意願是在該方法中設置它的值。 –

回答

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(); 
} 
+0

在真正的程序中,我沒有在構造函數中完成其他東西之前調用構造函數所需的全部信息。這就是爲什麼我要在'main()'中設置值的原因。 –

+1

@SamM就是這樣 - 你不能從全局範圍之外(即從函數內部)初始化靜態變量。 –

+0

@SamM我認爲你總是可以這樣做:http://ideone.com/G8ZgKL – user007

3

'實例' 是一個變量。你需要在主函數之外初始化它。 這應該工作:

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

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

A A::instance; 

int main() { 
    A::instance.foo(); 
    return 0; 
} 
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 . 
}