我正在尝试实现一个非常简单的 SmartPointer 用于学习目的,但是我正在努力解决我似乎无法调试的错误。即使在调试模式下,我也没有得到明确的信息,我错了,只有运行时断言。
到目前为止,这是 SmartPTR 的代码:
template <typename TYPE>
class SmartPointer
{
TYPE* pData;
public:
SmartPointer(void)
: pData(0)
{
std::cout << "DEFAULT CTOR" << std::endl;
}
SmartPointer(TYPE* data)
: pData(data)
{
std::cout << "CTOR WITH TYPE*" << std::endl;
}
SmartPointer(const SmartPointer<TYPE>& rhs)
{
std::cout << "COPY CTOR" << std::endl;
}
~SmartPointer(void)
{ delete pData; }
SmartPointer<TYPE>& operator=(const SmartPointer<TYPE>& rhs)
{
pData = rhs.pData;
return *this;
}
TYPE* operator->(void)
{ return pData; }
TYPE& operator*(void)
{ return *pData; }
};
我正在使用的课程非常先进。这是一个简单的 Person 类,可以在 Internet 上的任何地方找到,具有构造函数、复制构造函数和重载赋值运算符。现在有了简单的案例,我没有问题。
SmartPointer<Person> p(new Person("Henry", 42));
p->Display(std::cout, *p); // Prints: Henry - 42
SmartPointer<Person> q(p); // Causes runtime error.
SmartPointer<Person> q;
q = p; // The same runtime error as with copy constructor.
知道这哪里出错了吗?如果它有帮助,这里是 Person 类:
class Person
{
std::string name;
unsigned age;
public:
Person(const char* name, unsigned age)
: name(name), age(age)
{ std::cout << "PERSON CTOR CALLED!" << std::endl; }
Person(const Person& rhs)
: name(rhs.name), age(rhs.age)
{ std::cout << "PERSON COPY CTOR CALLED!" << std::endl; }
~Person(void)
{ }
public:
Person& operator=(const Person& rhs)
{
std::cout << "PERSON ASSIGNMENT OPERATOR CALLED!" << std::endl;
name = std::string(rhs.name);
age = rhs.age;
return *this;
}
public:
static std::ostream& Display(std::ostream& os, const Person& p);
};
std::ostream& Person::Display(std::ostream& os, const Person& p)
{
return os << p.name << " - " << p.age << std::endl;
}
感谢您的每一个帮助!- 乔。