我有很多C#代碼,我必須用C++編寫。我沒有太多的C++經驗。爲什麼我得到構造函數和這裏調用的複製構造函數?
我正在使用Visual Studio 2012來構建。該項目是一個C++中的靜態庫(不在C++/CLI中)。
我有一個靜態私有成員靜態方法的類。 當我調試時,我可以看到被調用的構造函數和複製構造函數。 我不明白爲什麼兩個人都會打電話,我想只有一個人會。 有沒有辦法讓我只能調用一個構造函數?
這是我的代碼
MyClass& MyClass::MyInstance()
{
static MyClass myLocalVariable = MyClass(/*parameters*/);
return myLocalVariable ;
}
當法MYINSTANCE被調用:
- 首先MyClass的的構造函數被調用
- 然後CopyConstructor
- ,然後在「返回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
參數缺點
複製缺點
析構函數
這在Visual Studio中還不是線程安全的。所以如果你有不止一個線程調用它,你就會有一場比賽。另外,直接將C#設計轉換爲C++設計,通常會讓您在內存管理方面遇到許多麻煩。 –
如果您執行了'MyClass myLocalVariable(/ * parameters * /);',看看您會得到什麼有意思。這*應該等同於你所擁有的東西,至少對於常規的基於堆棧的變量。 – TooTone
@SebastianRedl你是對的內存問題!這就是爲什麼我試圖在C++上使用像vector和string這樣的對象來最小化我的問題。原始代碼主要用於計算。但是我無法改變對靜態實例的需求。我的應用程序不是多線程的,但也許在Visual Studio中的測試是? – Dzyann