C++ 复制构造函数

C++ 复制构造函数,c++,C++,我正在尝试使用我的复制构造函数执行“深度复制”的复制部分: class myClass { public: myClass ( const char *cPtr, const float fValue ) myClass ( const myClass& myClassT ); private: const char* &myAddress; float MyFloater; }; //myClass.cpp myClass::myCl

我正在尝试使用我的复制构造函数执行“深度复制”的复制部分:

class myClass
{
public:

    myClass ( const char *cPtr, const float fValue )
    myClass ( const myClass& myClassT );

private:

    const char* &myAddress;
    float MyFloater;

};

//myClass.cpp

myClass::myClass( const char *cPtr, const float fValue )
{
// Initialize both private varaible types
   const char* &myAddress = cPtr;
   float myFloater = fValue;
}

myClass::myClass( const myClass& classType )
{
// copy what we did ... 
      myAddress = myClass.myAddress;
      myFloater = myClass.myFloater;
}
就这样,我只得到了“必须初始化基/成员初始化器列表中的whataver变量”

它们是在构造函数中初始化的! 我需要如何处理类类型对象地址?

几个问题:

1) 为什么要在第一个构造函数中重复变量声明

2) 为什么要将myAddress声明为引用而不仅仅是指针? 引用总是必须在构造函数初始化列表中初始化。这可能是错误消息的原因。C++中的构造函数体中初始化是不可接受的。

在第二个构造函数中,您可能需要如下内容:

myClass::myClass( const myClass& classType ):myAddresss(classType.myAddress), myFloater(classType.myFloater)
{
}

之所以如此,是因为对象是如何构造的。在构造函数的主体执行的点上,对象已经被认为是“已建”的,因此引用应该已经有效,所以引用的赋值被C++拒绝。 顺便说一下,这不是一个真正的深度复制

const char* &myAddress;
是引用,因此必须在构造函数期间在初始值设定项列表中初始化,即

myClass::myClass(const char *& cPtr, const float fValue): myAddress(cPtr)
请注意,这是处理这种情况的一种不好的方法(当然,这取决于您尝试执行的操作),因为如果传递的指针超出范围,那么您就完蛋了


一个更好的方法(同样,取决于你要做什么)就是在你的“深度”过程中复制指针复制、重新分配和复制其内容。当然,除非您确实需要对指针的引用。

您不是在初始化构造函数中的成员,而是在声明两个新的局部变量,它们的名称与类中的相同。使用初始值设定项列表初始化它们如下所示:

myClass::myClass( const char *cPtr, const float fValue )
    : myAdress(cPtr), myFloater(fValue)
{
}
class myClass
{
public:

    myClass ( const char *cPtr, const float fValue );
    myClass ( const myClass& myClassT );

private:

    const char* &myAddress;
    float MyFloater;

};

//myClass.cpp

myClass::myClass( const char *cPtr, const float fValue ) : myAddress(cPtr), MyFloater(fValue)
{
}

myClass::myClass( const myClass& classType ) : myAddress(classType.myAddress), MyFloater(classType.MyFloater)
{
// copy what we did ... 
}

除了其他人所说的之外,您并不是真正在做“深度复制”,您所做的是将指针设置为指向相同的点,这不是深度复制。您还需要复制指针指向的任何对象(为了安全起见)。

请尝试使用如下代码:

myClass::myClass( const char *cPtr, const float fValue )
    : myAdress(cPtr), myFloater(fValue)
{
}
class myClass
{
public:

    myClass ( const char *cPtr, const float fValue );
    myClass ( const myClass& myClassT );

private:

    const char* &myAddress;
    float MyFloater;

};

//myClass.cpp

myClass::myClass( const char *cPtr, const float fValue ) : myAddress(cPtr), MyFloater(fValue)
{
}

myClass::myClass( const myClass& classType ) : myAddress(classType.myAddress), MyFloater(classType.MyFloater)
{
// copy what we did ... 
}

在类声明中,您有MyFloster私有成员,但在定义中您使用MyFloter?此外,您还应该决定使用何种编码风格,并与之保持一致。例如,我用大写字母写类型,用小写字母写变量名。