【问题标题】:Passing a class as argument which has a private constructor that takes no parameters将类作为参数传递,该类具有不带参数的私有构造函数
【发布时间】:2011-10-02 09:06:41
【问题描述】:

Simulator 应该在其中携带Missile 对象的副本。但是Missile 没有零参数的公共构造函数,所以我无法将它作为参数传递。

我使用的是 Visual Studio 2010,它给出了以下错误:

错误 1 ​​c:...\simulator.cpp 第 5 行 错误 C2248:“导弹:​​:导弹”: 无法访问声明的私有成员 在“导弹”类中

错误 2 c:...\simulator.cpp 第 4 行 IntelliSense:“Missile::Missile()” (在第 11 行声明 "c:...\Missile.h") 无法访问

那么,如何传递具有私有构造函数的类的对象作为参数?

(注意:我的代码没有入口点。我只是想把它编译成一个库。)

Missile.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

Missile.cpp

#include "Missile.h"

Missile::Missile(double xm0, double ym0, double Vmx0, double Vmy0)
{
}

Missile::Missile()
{
}

Missile::~Missile()
{
}

Simulator.h

#ifndef SIMULATOR_H
#define SIMULATOR_H

#include "Missile.h"

class Simulator
{
    public:
        Simulator(const Missile & missile);
        ~Simulator();

    private:
        Missile m_Missile;
};

#endif

Simulator.cpp

#include "Simulator.h"

Simulator::Simulator(const Missile & missile)
{                                       // Line #4
    m_Missile = missile;                    // Line #5
}

Simulator::~Simulator()
{
}

【问题讨论】:

    标签: c++ class parameters constructor arguments


    【解决方案1】:

    您将使用所谓的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 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 类也将具有编译器生成的复制构造函数和复制赋值运算符。

    如果没有c-tor initializerMissile 成员将被默认初始化,这将调用您已声明为private 的默认构造函数。

    You should always use c-tor initializers when you can,因为它比在构造函数中分配给成员变量更通用。

    这实际上是 C++ 中一个相当基本的概念,任何good book on C++ 都会涵盖构造函数和编译器生成的函数。

    【讨论】:

    • 现在,在使用 ctor-initializer 之后,我应该删除 Simulator::Simulator() 中的 m_Missile = missile 行吗?
    • @hkBattousai:是的。如果您已经通过编译器生成的复制构造函数复制了对象,则无需使用赋值。
    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多