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?此外,您还应该决定使用何种编码风格,并与之保持一致。例如,我用大写字母写类型,用小写字母写变量名。