![](/img/trans.png)
[英]Create template class which takes template class as argument in a constructor
[英]Passing a class as argument which has a private constructor that takes no parameters
Simulator
應該在里面攜帶一份Missile
object 的副本。 但是Missile
沒有零參數的公共構造函數,所以我不能將它作為參數傳遞。
我正在使用 Visual Studio 2010,它給出了以下錯誤:
錯誤 1 c:...\simulator.cpp 第 5 行錯誤 C2248: 'Missile::Missile': 無法訪問在 class 'Missile' 中聲明的私有成員
錯誤 2 c:...\simulator.cpp 第 4 行 IntelliSense:“Missile::Missile()”(在“c:...\Missile.h”的第 11 行聲明)不可訪問
那么,如何傳遞具有私有構造函數作為參數的 class 的 object ?
(注意:我的代碼沒有入口點。我只是想將其編譯為庫。)
導彈.h
#ifndef MISSILE_H
#define MISSILE_H
class Missile
{
public:
Missile(double xm0, double ym0, double Vmx0, double Vmy0);
~Missile();
private:
Missile(); // Line #11
};
#endif
導彈.cpp
#include "Missile.h"
Missile::Missile(double xm0, double ym0, double Vmx0, double Vmy0)
{
}
Missile::Missile()
{
}
Missile::~Missile()
{
}
模擬器.h
#ifndef SIMULATOR_H
#define SIMULATOR_H
#include "Missile.h"
class Simulator
{
public:
Simulator(const Missile & missile);
~Simulator();
private:
Missile m_Missile;
};
#endif
模擬器.cpp
#include "Simulator.h"
Simulator::Simulator(const Missile & missile)
{ // Line #4
m_Missile = missile; // Line #5
}
Simulator::~Simulator()
{
}
您將使用所謂的ctor-initializer
(有些人稱其為“初始化器列表”,盡管 C++ 標准實際上將其稱為“ctor-initializer”):
// In your Simulator.cpp file:
Simulator::Simulator(const Missile & missle) : m_Missile(missle)
/*^^^^^^^^^^^^^^^^*/
/* This part here */
{
/* No assignment needed */
}
這相當於調用了Missile
class 的復制構造函數,它是由編譯器自動為你生成的,它所做的只是復制每個數據成員:
class Missile
{
public:
Missile(double xm0, double ym0, double Vmx0, double Vmy0);
~Missile();
// Compiler generated copy constructor
Missile(const Missile& rhs) /* copies each data member */
{
}
// Compiler generated copy assignment operator
Missile& operator=(const Missile& rhs)
{
/* copies each data member */
}
private:
Missile(); // default constructor
};
請注意, Simulator
class 也將具有編譯器生成的復制構造函數和復制賦值運算符。
如果沒有c-tor initializer
, Missile
成員將被默認初始化,這將調用您已聲明為private
的默認構造函數。
您應該盡可能使用c-tor initializer
程序,因為它比在構造函數中分配給成員變量更通用。
這實際上是 C++ 中一個相當基本的概念,任何關於 C++ 的好書都將涵蓋構造函數和編譯器生成的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.