繁体   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