【问题标题】:How to write a copy constructor to a class which have only parametric constructor no default constructor for its base class?如何将复制构造函数写入只有参数构造函数而没有其基类的默认构造函数的类?
【发布时间】:2020-03-16 05:40:43
【问题描述】:

我正在尝试为 Clib 类编写一个复制构造函数,该类派生自没有默认构造函数的 Cotherlib 我的原始代码包含一个深拷贝操作和 wat 来纠正另一个返回 CLib 对象的 c 函数,因此需要一个复制构造函数 #include "stdafx.h"

    struct IMem
    {
        virtual  void function_f_1() = 0;
        virtual  void function_f_2() = 0;

    };

    class MyMem : public IMem
    {
    public:
        void function_f_1()
        {
        }
        void function_f_2()
        {
        }
    };
    class CDependentLib1
    {
    public:
        CDependentLib1()
        {
        }
        ~CDependentLib1()
        {
        }
    };
    class CDependentLib2
    {
    public:
        CDependentLib2()
        {
        }
        ~CDependentLib2()
        {
        }
    };

    class COtherLib
    {
    public:
        COtherLib(IMem &Mem, CDependentLib2 &objDependentLIb2)
        {
        }
        ~COtherLib()
        {
        }

    };
    class CLib : public COtherLib
    {
    public:
        CLib(IMem &mem):
            m_1(),
            m_2(),
            COtherLib(mem,m_2)  
        {
        }
        ~CLib()
        {
        }
        CLib(const CLib &ObjClib)// here i am getting error
        {
        }
    private :
        CDependentLib1 m_1;
        CDependentLib2 m_2;


    };
    int main()
    {

        MyMem ObjMem;
        CLib objLib(ObjMem);
        return 0;
    }

如何创建复制构造函数。我无权编辑基类代码并添加默认构造函数

【问题讨论】:

  • 如果不存在默认构造函数,我不明白为什么编写复制构造函数会有问题。对于您显示的代码 A 无法构造,因为您显示的每个构造函数都需要一个已经存在的 A 实例作为参数。所以没有办法创建A 的实例。因此,如果您至少有一个不需要a 实例的构造函数,如果工作demo on wandbox。因此,请显示您的问题的minimal reproducible exampleA(const A &ObjA) 失败并解释您在此处失败的意思。
  • 请显示minimal reproducible example,大概你有一个引用成员,这使得实现复制构造函数变得不可能
  • A 类 { int i; public: A(Someclass & objSomeClass): b(objSomeClass), c(objSomeClass)// 对象的构造依赖于另一个类对象 { . } A(const A &ObjA) // 这里会失败,因为类 A 没有默认构造函数 { } };
  • @HareeshkumarKaiprath 不要在评论部分粘贴代码,edit 你的问题,而不是添加该信息。而minimal reproducible example 意味着您需要创建一个简单的完整代码示例,可以复制、编译然后导致您遇到的错误。那些不完整的代码片段对追踪你的问题没有帮助,因为对于没有默认构造函数的类,这些都不应该导致创建复制构造函数的问题。

标签: c++ constructor copy


【解决方案1】:

现在是时候不要感到困惑并获得一本好的 C++ 书了。

如果您要覆盖默认的复制构造函数,则必须从原始复制元素来复制自己。除非您打算在 copy ctor 中实际做某事,否则根本不要放置 copy ctor,或者如果您只想为此而拥有一个 copy ctor:

class A 
{
    int i;

public:
    A(int a): i(a) {}
    A(const A &) = default;
};

虽然只有一个复制 ctor 是一种不好的做法。最好遵循rule of 3 或 5 规则。

【讨论】:

  • 删除复制构造函数会更容易。
  • @juanchopanza 这就是为什么我写“如果你只是想为了它而拥有一个复制 ctor”或“最好遵循 3 规则或 5 规则”。但还是编辑了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2012-06-30
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2022-01-01
相关资源
最近更新 更多