hkB*_*sai 3 c++ parameters constructor arguments class
Simulator应该在其中携带一个Missile对象的副本.但Missile没有公共构造函数,零参数,所以我无法将其作为参数传递.
我正在使用Visual Studio 2010,它会出现以下错误:
错误1 c:...\simulator.cpp第5行错误C2248:'导弹::导弹':无法访问"导弹"类中声明的私有成员
错误2 c:...\simulator.cpp第4行智能感知:"导弹::导弹()"(在"c:...\Missile.h"的第11行声明)无法访问
那么,如何将具有私有构造函数的类的对象作为参数传递?
(注意:我的代码没有入口点.我只是想把它编译成一个库.)
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
Run Code Online (Sandbox Code Playgroud)
Missile.cpp
#include "Missile.h"
Missile::Missile(double xm0, double ym0, double Vmx0, double Vmy0)
{
}
Missile::Missile()
{
}
Missile::~Missile()
{
}
Run Code Online (Sandbox Code Playgroud)
Simulator.h
#ifndef SIMULATOR_H
#define SIMULATOR_H
#include "Missile.h"
class Simulator
{
public:
Simulator(const Missile & missile);
~Simulator();
private:
Missile m_Missile;
};
#endif
Run Code Online (Sandbox Code Playgroud)
Simulator.cpp
#include "Simulator.h"
Simulator::Simulator(const Missile & missile)
{ // Line #4
m_Missile = missile; // Line #5
}
Simulator::~Simulator()
{
}
Run Code Online (Sandbox Code Playgroud)
您可以使用所谓的a ctor-initializer(有些人称之为"初始化列表",尽管C++标准实际上将其称为"ctor-initializer"):
// In your Simulator.cpp file:
Simulator::Simulator(const Missile & missle) : m_Missile(missle)
/*^^^^^^^^^^^^^^^^*/
/* This part here */
{
/* No assignment needed */
}
Run Code Online (Sandbox Code Playgroud)
这等同于调用拷贝构造函数中的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
};
Run Code Online (Sandbox Code Playgroud)
请注意,Simulator该类还将具有编译器生成的复制构造函数和复制赋值运算符.
如果没有c-tor initializer,Missile则会默认初始化成员,这将调用您声明的默认构造函数private.
您应该始终使用c-tor initializers,因为它比在构造函数中分配成员变量更通用.
这实际上是C++中一个相当基本的概念,任何关于C++的好书都将涵盖构造函数和编译器生成的函数.