复制构造函数

时间:2009-03-27 03:56:52

标签: c++

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

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变量。

他们在构造函数中被初始化! 我需要对classtype对象地址做什么?

5 个答案:

答案 0 :(得分:7)

const char* &myAddress;

是一个引用,因此必须在构造函数期间在初始化列表中初始化,即

myClass::myClass(const char *& cPtr, const float fValue): myAddress(cPtr)

请注意,这是处理这种情况的一种不好的方法(当然,取决于你要做的事情),因为如果传递的指针超出范围,那么你就是拧。

更好的方法(再次,取决于你要做的事情)只是将指针复制过来,在“深度”复制过程中,重新分配和复制其内容。当然,除非你真的需要引用指针。

答案 1 :(得分:3)

几个问题:

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

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

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

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

其原因与对象的构造方式有关。在构造函数的主体执行时,该对象已被认为已经“构建”,因此引用应该已经有效,因此C ++会拒绝您对引用的赋值。

顺便说一下,这不是一个很深的副本......

答案 2 :(得分:3)

除了其他人所说的,你实际上并没有做一个“深层复制”你正在做的是设置指针指向同一个,这不是一个深层复制。你需要复制指针所指向的任何东西(为了安全起见)。

答案 3 :(得分:2)

您没有初始化构造函数中的成员,而是声明两个新的局部变量,其名称与类中的变量相同。用初始化列表初始化它们看起来像这样:

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

答案 4 :(得分:0)

尝试使用这样的代码:

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 ... 
}