2013-11-22 55 views
0

我有很多C#代碼,我必須用C++編寫。我沒有太多的C++經驗。爲什麼我得到構造函數和這裏調用的複製構造函數?

我正在使用Visual Studio 2012來構建。該項目是一個C++中的靜態庫(不在C++/CLI中)。

我有一個靜態私有成員靜態方法的類。 當我調試時,我可以看到被調用的構造函數和複製構造函數。 我不明白爲什麼兩個人都會打電話,我想只有一個人會。 有沒有辦法讓我只能調用一個構造函數?

這是我的代碼

MyClass& MyClass::MyInstance() 
{  
    static MyClass myLocalVariable = MyClass(/*parameters*/); 
    return myLocalVariable ; 
} 

當法MYINSTANCE被調用:

  1. 首先MyClass的的構造函數被調用
  2. 然後CopyConstructor
  3. ,然後在「返回myInstance「行。

是否有可能由myLocalVariable持有的實例只是暫時的,並可能在以後被銷燬?

更新:

因爲有些人不能重現我的問題,我在這裏加入更多的代碼。現在我有相同的行爲3個項目(其中一個是我從我的單元測試調用靜態庫,另2 Win32控制檯應用程序)

C++主要

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyClass& instance = MyClass::MyInstance(); 

    return 0; 
} 

C++ MyClass的.H

#pragma once 
#include <string> 

using namespace std; 
class MyClass 
{ 
private: 
    string name; 

public: 
    MyClass(void); 
    MyClass(string name); 
    MyClass(const MyClass&); 

    ~MyClass(void); 

    static MyClass& MyInstance(); 
}; 

C++ MyClass.cpp

#include "MyClass.h" 
#include <iostream> 
using std::cout; 

MyClass::MyClass(void) 
{ 
    cout << "Empty Cons\n"; 
} 

MyClass::MyClass(string name) 
{ 
    this->name = name; 
    cout << "Parameters Cons\n"; 
} 

MyClass::MyClass(const MyClass& myClass) 
{ 
    name = myClass.name; 
    cout << "Copy Cons\n"; 
} 

MyClass::~MyClass(void) 
{ 
    cout << "Destructor\n"; 
} 

MyClass& MyClass::MyInstance() 
{  
    cout << "MyInstance\n"; 
    static MyClass myInstance = MyClass("MyClassName"); 
    return myInstance; 
} 

我的輸出:

MYINSTANCE

參數缺點

複製缺點

析構函數

+0

這在Visual Studio中還不是線程安全的。所以如果你有不止一個線程調用它,你就會有一場比賽。另外,直接將C#設計轉換爲C++設計,通常會讓您在內存管理方面遇到許多麻煩。 –

+1

如果您執行了'MyClass myLocalVariable(/ * parameters * /);',看看您會得到什麼有意思。這*應該等同於你所擁有的東西,至少對於常規的基於堆棧的變量。 – TooTone

+0

@SebastianRedl你是對的內存問題!這就是爲什麼我試圖在C++上使用像vector和string這樣的對象來最小化我的問題。原始代碼主要用於計算。但是我無法改變對靜態實例的需求。我的應用程序不是多線程的,但也許在Visual Studio中的測試是? – Dzyann

回答

1

由myLocalVariable持有的實例是否可能僅僅是暫時的並且可能在以後被銷燬?

myLocalVariable是靜態的,因此不會被破壞,將可每次撥打電話的時間MYINSTANCE

MyClass& MyClass::MyInstance() 
{  
    static MyClass myLocalVariable = MyClass(/*parameters*/); 
    return myLocalVariable ; 
} 

這隻會調用1個構造函數是PARAM構造,如通過引用返回myLocalVariable而不是價值。

3

只寫變量

static MyClass instance; 

如果沒有參數,或者

static MyClass instance(foo, bar); 

如果有。或者,因爲這是MSVC 2012年,統一初始化語法可能支持:

static MyClass instance{/*args here, could be empty*/}; 

這將初始化,而不是初始化一個臨時並將其複製到目標就地變量。 (編譯器將被允許忽略複製,但顯然它在你的情況並非如此。)

有沒有可能是正在舉行的myLocalVariable實例只是時間

注意,第一次,正確的詞是「暫時的」,那第二個,myLocalVariable這個實例,它沒有一個。除非明確使用指針或引用,否則C++對象的行爲更像C#結構,而不是類,因爲變量不包含引用,它們確實是對象。

+0

感謝您指出變量「是實例」,需要時間來適應從C# – Dzyann

相關問題