2011-07-10 42 views
3

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

我使用Visual Studio 2010中,它提供了以下错误:

错误1个C:\ simulator.cpp 5号线 错误C2248:'导弹::导弹: 不能访问私有成员声明 类 '导弹'

错误2个C:\ simulator.cpp 4号线 智能感知: “导弹::导弹()” (在 行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() 
{ 
} 

回答

7

你会使用什么叫做ctor-initializer(也有人称其为“初始化列表”,虽然C++标准实际上称之为“构造函数初始化程序”) :

// 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 initializer,该Missile成员将默认初始化代替,这将调用默认构造函数,它已宣布为private

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

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

+0

现在,在使用ctor-initializer之后,我应该在Simulator :: Simulator()'里面移除'm_Missile = missile'行吗? – hkBattousai

+1

@hkBattousai:是的。当您已通过编译器生成的拷贝构造函数复制对象时,不需要使用赋值。 –

相关问题