在本文之后,我试图实现一个智能类
https://www.codeproject.com/Articles/15351/Implementing-a-simple-smart-pointer-in-c
我有一门课叫
人
.
class Person
{
private:
char* name;
int age;
public:
Person();
Person(const char* pName, int pAge);
~Person();
void Display();
};
人cpp
#include<iostream>
#include "Person.h"
Person::Person() : name(nullptr), age(0)
{}
Person::Person(const char* pName, int pAge)
{
name = new char[std::strlen(pName) + 1];
std::strcpy(name, pName);
age = pAge;
}
Person::~Person()
{}
void Person::Display()
{
std::cout << "Name is " << name << " and age is " << age << std::endl;
}
参考计数。H
#pragma once
class ReferenceCount
{
private:
int count;
public:
ReferenceCount();
~ReferenceCount();
void AddRef();
void DelRef();
};
参考计数。cpp
#include "ReferenceCount.h"
ReferenceCount::ReferenceCount() : count(0)
{}
ReferenceCount::~ReferenceCount()
{}
void ReferenceCount::AddRef()
{
count++;
}
void ReferenceCount::DelRef()
{
count--;
}
SmartClass。H
#pragma once
#include "ReferenceCount.h"
template <typename T> class SmartClass
{
private:
T* pData;
ReferenceCount* rc;
public:
SmartClass();
SmartClass(T* data);
SmartClass(const SmartClass<T>& sp); // copy constructor
~SmartClass();
T& operator*();
T* operator->();
SmartClass<T>& operator=(const SmartClass<T>& sp); // copy assignment operator
};
SmartClass。cpp
#include "SmartClass.h"
template <typename T>
SmartClass<T>::SmartClass() : rc(0)
{
rc = new ReferenceCount();
rc->AddRef();
}
template <typename T>
SmartClass<T>::SmartClass(T* data) : pData(data), rc(0)
{
rc = new ReferenceCount();
rc->AddRef();
}
template<typename T>
SmartClass<T>::SmartClass(const SmartClass<T>& sp) // copy constructor
{
this->pData = sp.pData;
this->rc = sp.rc;
}
template <typename T>
SmartClass<T>::~SmartClass()
{
if (rc->DelRef() == 0)
{
delete pData;
delete rc;
}
}
template <typename T>
T& SmartClass<T>::operator*()
{
return *pdata;
}
template<typename T>
T* SmartClass<T>::operator->()
{
return pData;
}
template <typename T>
SmartClass<T>& SmartClass<T>::operator=(const SmartClass<T>& sp)
{
if (this != &sp)
{
if (rc->DelRef() == 0)
{
delete pData;
delete rc;
}
pData = sp.pData;
rc = sp.rc;
rc->AddRef();
}
return *this;
}
主要的cpp
#include "Person.h"
#include "SmartClass.h"
int main()
{
SmartClass<Person> p(new Person("Scott", 25));
return 0;
}
在使用Visual Studio 2017构建程序时,我遇到了以下链接器错误。
LNK2019未解析的外部符号“public:u thiscall SmartClass::SmartClass(class Person*)”(??0$SmartClass@VPerson@@@@QAE@PAVPerson@@@Z) 在函数_main中引用
LNK2019未解析的外部符号“public:u thiscall SmartClass::~SmartClass(void)”(??1$SmartClass@VPerson@@@@QAE@XZ)在函数_main中引用
我在这段代码中做错了什么?你能帮我纠正一下吗?
非常感谢。