加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将一个类作为参数传递,该参数具有不带参数的私有构造函数

发布时间:2020-12-16 09:35:57 所属栏目:百科 来源:网络整理
导读:模拟器应该在其中携带一个导弹对象的副本.但是Missile没有零参数的公共构造函数,所以我无法将它作为参数传递. 我正在使用Visual Studio 2010,它会出现以下错误: Error 1 c:…simulator.cpp Line #5 error C2248: ‘Missile::Missile’ : cannot access pri
模拟器应该在其中携带一个导弹对象的副本.但是Missile没有零参数的公共构造函数,所以我无法将它作为参数传递.

我正在使用Visual Studio 2010,它会出现以下错误:

Error 1 c:…simulator.cpp Line #5
error C2248: ‘Missile::Missile’ :
cannot access private member declared
in class ‘Missile’

Error 2 c:…simulator.cpp Line #4
IntelliSense: “Missile::Missile()”
(declared at line 11 of
“c:…Missile.h”) is inaccessible

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

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

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 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()
{
}

解决方法

您可以使用所谓的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 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初始化程序,则会默认初始化Missile成员,这将调用默认构造函数,您已声明它是私有的.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读