首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从基指针复制派生类的构造函数

从基指针复制派生类的构造函数
EN

Stack Overflow用户
提问于 2015-04-15 03:16:22
回答 2查看 1.5K关注 0票数 0

我环顾四周,到处找不到我问题的答案。我试图从基类的指针数组中使用派生类的复制构造函数。我学到的唯一一件事是,我应该使用dynamic_cast,但不能做到这一点。

到目前为止,这是我代码的重要部分(因为我有16个不同的文件,所以原来的代码很大,但这应该足够了)。

编辑:我收到的这样做的错误是: way dynamic_cast '& properties‘(类型为'class Property**')类型'class Commercial*’(源不是指向类的指针)。

代码语言:javascript
复制
#include "rentals.h"
#include "commercial.h"
#include "sales.h"
#include "comSales.h"
#include "resSales.h"
#include "resRentals.h"
#include "comRentals.h"

const int MAX_PROPERTIES = 5;

int main(void) {
   int i;


   Property *properties[MAX_PROPERTIES];


   properties[0] = new Commercial("Notting Hill McDonalds", "4 Gardiner Road",
                                  "Notting Hill", 5000, "Li3000");


   properties[1] = new ResRentals("Janet Dalgleish", "30 Firhill Court",
                           "Mary Hill", 4000, 500.00, 300.00, 4);


   properties[2] = new Commercial(dynamic_cast<Commercial*>(properties[0]));  // <-- the copy constructor I can not get to work.


   delete[] properties;

   return 0;
}

commercial.cpp文件

代码语言:javascript
复制
#include "property_a.h"
#include "commercial.h"


Commercial::Commercial() : Property() {
   owner = "NULL";
   address = "NULL";
   suburb = "NULL";
   postcode = 0;
   license = "NULL";
}

Commercial::Commercial(string theOwner, string theAddress,
                        string theSuburb, int thepostCode,
                        string theLicense): Property(theOwner, theAddress,
                        theSuburb, thepostCode), license(theLicense) {}

Commercial::~Commercial() {}

Commercial::Commercial(const Commercial& orig) : Property(orig),
                        license(orig.getLicense()) {}

void Commercial::print() {
   cout << getOwner() << endl;
   cout << getAddress() << endl;
   cout << getSuburb() << endl;
   cout << getPostcode() << endl;
   cout << getLicense() << endl;
}

商业.h文件

代码语言:javascript
复制
#ifndef __COMMERCIAL_H__
#define __COMMERCIAL_H__


#include "property_a.h"

class Commercial :  public virtual Property
{
protected:
  string license;

public:
  Commercial();
  Commercial(string theOwner, string theAddress, string theSuburb,
              int thepostCode, string theLicense);

   ~Commercial() ;

   Commercial(const Commercial& orig);

  void input() ;   // Data input for a Shop object
  void print() ;  // Data output for a Shop object

  string getLicense() const {return license;};   //Note the use of const

  void setLicense(string theLicense) {license = theLicense;};

};

property_a.cpp文件

代码语言:javascript
复制
#include "property_a.h"

Property::Property(){
   owner = "NULL";
   address = "NULL";
   suburb = "NULL";
   postcode = 0;
}

Property::Property(string theOwner, string theAddress,
                   string theSuburb, int thepostCode):
                     owner(theOwner), address(theAddress),
                     suburb(theSuburb), postcode(thepostCode){}

Property::~Property() {}

Property::Property(const Property& orig) :
                     owner(orig.getOwner()), address(orig.getAddress()),
                     suburb(orig.getSuburb()), postcode(getPostcode()) {}

property_a.h文件

代码语言:javascript
复制
#ifndef __PROPERTY_A_H__
#define __PROPERTY_A_H__


/*TODO  REQUIRED HEADER FILES AND NAMESPACES*/
#include <string>
#include "utility1.h"

class Property
{
protected:
  string owner;
  string address;
  string suburb;
  int postcode;

public:
  Property();
  Property(string theOwner, string theAddress, string theSuburb, int thepostCode);
  virtual ~Property();
  Property(const Property& orig);
  virtual void input() ;   // Data input for a Property object
  virtual void print() ;  // Data output for a Property object

  string getOwner() const {return owner;};   //Note the use of const
  string getAddress() const {return address;};
  string getSuburb() const {return suburb;};
  int getPostcode() const {return postcode;};

  void setOwner(string newOwner) {owner = newOwner;};
  void setAddress(string newAddress) {address = newAddress;};
  void setSuburb( string  newSuburb) {suburb = newSuburb;};
  void setPostcode(int  newPostcode) {postcode = newPostcode;};
};
#endif

我希望这是足够的细节

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-15 03:22:40

看到这些错误是很好的,但是看起来您根本没有调用复制构造函数:

代码语言:javascript
复制
new Commercial(dynamic_cast<Commercial*>(properties[0]));

就像打电话一样

代码语言:javascript
复制
Commercial(Commercial * other);

所以你需要

代码语言:javascript
复制
new Commercial(*dynamic_cast<Commercial*>(properties[0]));
票数 1
EN

Stack Overflow用户

发布于 2015-04-15 03:29:47

properties2 = new (dynamic_cast(Properties));// <--我无法工作的复制构造函数。

这是将properties[0]转换为Commercial*。但这不是复制构造函数的签名。因此,您需要new Commercial(*dynamic_cast<Commercial*>(properties[0]));

在本例中,您可以使用static_cast<Commercial&>(*properties[0]),因为您知道 properties[0]Commercial类型。

但是,一般来说,如果您使用的是dynamic_cast,这可能意味着您不确定派生类型是什么,您需要在取消引用之前检查NULL (即转换失败)。

替代方案

您可以考虑使用多态API来处理这个问题。

代码语言:javascript
复制
class Base
{
public:
    virtual ~Base() = default;
    Base* clone() const = 0;
};

class D1 : public Base
{
public:
    virtual ~D1() override = default;
    D1* clone() const { return new D1(*this); }
};

class D2 : public Base
{
public:
    virtual ~D2() override = default;
    D2* clone() const { return new D2(*this); }
};

int main()
{
    std::unique_ptr<Base> b1(new D2());
    std::unique_ptr<Base> b2(b1->clone());

    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29641010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档