簡體   English   中英

將 class 作為參數傳遞,該參數具有不帶參數的私有構造函數

[英]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 initializerMissile成員將被默認初始化,這將調用您已聲明為private的默認構造函數。

您應該盡可能使用c-tor initializer程序,因為它比在構造函數中分配給成員變量更通用。

這實際上是 C++ 中一個相當基本的概念,任何關於 C++ 的好書都將涵蓋構造函數和編譯器生成的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM