0

Можно ли использовать конструктор копирования для инициализации идентичного производного класса из этих производных классов «близнец»?Конструкторы и конструкторы копирования по идентичным производным классам

Я хочу, чтобы инициализировать объект типа Computer, который идентичен объекту, который я уже инициализировал типа User. Computer cCarrier = User uCarrier; Вид вещи.

Например

class Game 
{ 
public: 
    //No constructor Intentional 
protected: 
    int m_iSize; 
    string m_strName; 

}; 

class User: public Game 
{ 
public: 
    User(int _iSize, string str_Name); 
    ~User(); 

}; 

class Computer: public Game 
public: 
    Computer(int _iSize, string str_Name); 
    ~Computer(); 
}; 

main.cpp

#include "game.h" 

using namespace std; 

int main() 
{ 
    User carrier(5, "Airship Carrier"); 
    //Computer carrier = User::carrier; 
}; 

Они одинаковые производные классы, я только сделал их таким образом, как виртуальный и визуальный способ представления User и AI броненосцев в программирующий код, для программиста, а также для проверки сторонних кораблей для столкновений друг с другом и стрельбы.

+0

, когда вы говорите в своем коде «Нет конструктора Intentional», вы понимаете, что есть объявленные конструкторы с неявным объявлением? – Brahim

+1

Вы можете написать конструкторы, принимающие любые объекты. 'Computer :: Computer (User const & other) {/ * ... * /}' - то, что вы делаете для этого конструктора копий *, делает так, что это имеет смысл, зависит от вас. И для того, чтобы получить доступ к любому из '' '' '' членов '' '' пользователя '' нужно использовать страшный 'друг' ... – DevSolar

+1

Я думаю, вам нужно определить конструктор на компьютере, который принимает пользователя в качестве параметра. – Brahim

ответ

0

User и Computer - совсем другой тип. Вы можете добавить для него конструктор копии шаблона.

Добавить геттер в базовом классе:

class Game 
{ 
public: 
    //No constructor Intentional 
    int get_iSize() { return m_iSize; } 
    string get_strName() { return m_strName; } 
protected: 
    int m_iSize; 
    string m_strName; 

}; 

затем

class Computer: public Game 
{ 
public: 
    template <typename T> 
    Computer(const T& t) { 
     m_iSize = t.get_iSize(); 
     m_strName = t.get_strName(); 
    } 
    // ... 
}; 

и рассмотреть, чтобы сделать конструктор явным, чтобы избежать неожиданного неявное приведение.

0

Ну или вы хотите 2 разных типа, и тогда вы не можете этого сделать (не можете создать Cat от собаки), или вы хотите, чтобы они делились одним и тем же типом, но чтобы манипулировать с помощью разных типов имен, тогда вы должны просто использовать typedef :

class Game 
{ 
public: 
    Game(int _iSize, string str_Name); 
private: 
    int m_iSize; 
    string m_strName; 
}; 

using User = Game; 
using Computer = Game; 

тем не менее, с точки зрения дизайна, это способ сделать это, кажется неправильным, как компьютер не является пользователем (ИМХО).

С другой стороны, вы можете создать конструктор в пользователе и на компьютере, который построен из игры; что-то вроде:

class Computer { 
    Computer(const Game &game) : Game(game) { /*...*/ } 
    /*...*/ 
}; 

но остается фактом, что создание пользователя с компьютера кажется «странным».

+0

Он реализует игру с линкорами. У него есть один класс для кораблей «Пользователь», а один - для «Компьютер». В общем, плохой дизайн, я согласен, но именно поэтому он смотрит на создание/назначение корабля 'Computer' из' User'. – DevSolar

0

Единственное соотношение между вашими User и Computer типами состоит в том, что они оба происходят от Game.

Таким образом, нет возможности реализовать конструктор либо путем делегирования другому так, как вы хотите (не считая локализации, которая создает отдельные объекты, не используя конструктор одного типа для инициализации экземпляра несвязанный тип).