Передача класса в качестве аргумента, который имеет закрытый конструктор, который не принимает параметров - PullRequest
3 голосов
/ 11 июля 2011

Simulator должен содержать в себе копию объекта Missile. Но Missile не имеет открытого конструктора с нулевыми параметрами, поэтому я не могу передать его в качестве параметра.

Я использую Visual Studio 2010, и он выдает следующие ошибки:

Ошибка 1 c: ... \ simulator.cpp Строка № 5 ошибка C2248: «Ракета :: Ракета»: не может получить доступ к объявленному приватному члену в классе «Ракета»

Ошибка 2 c: ... \ simulator.cpp Строка # 4 IntelliSense: "Ракета :: Ракета ()" (объявлено в строке 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()
{
}

1 Ответ

7 голосов
/ 11 июля 2011

Вы бы использовали то, что называется 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 initializer член Missile будет по умолчанию инициализирован вместо этого,который вызвал бы конструктор по умолчанию, который вы объявили private.

Вы всегда должны использовать c-tor initializer s, когда вы можете , так как это гораздо более общее, чем присвоениепеременные-члены в конструкторе.

Это на самом деле довольно фундаментальная концепция в C ++, и любая хорошая книга по C ++ будет охватывать конструкторы и функции, сгенерированные компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...