MST

星途 面试题库

面试题:C++ 类定义中的内存管理与模板元编程结合

实现一个 `SmartPtr` 模板类,模拟智能指针的行为,用于管理 `MyClass` 类对象的内存。`MyClass` 类有一些普通成员变量和成员函数。要求 `SmartPtr` 类支持引用计数机制来自动释放内存,并且在编译期利用模板元编程技术来实现一些类型检查功能,确保 `SmartPtr` 只能指向 `MyClass` 及其派生类对象。请给出完整的 `SmartPtr` 和 `MyClass` 类定义,以及必要的测试代码。
37.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <type_traits>

// MyClass类定义
class MyClass {
private:
    int data;
public:
    MyClass(int value = 0) : data(value) {}
    ~MyClass() { std::cout << "MyClass destructor called." << std::endl; }
    void printData() { std::cout << "Data: " << data << std::endl; }
};

// SmartPtr模板类定义
template <typename T>
class SmartPtr {
    static_assert(std::is_base_of<MyClass, T>::value, "SmartPtr can only point to MyClass and its derived classes.");
private:
    T* ptr;
    int* refCount;
public:
    SmartPtr(T* p = nullptr) : ptr(p) {
        if (ptr) {
            refCount = new int(1);
        } else {
            refCount = new int(0);
        }
    }

    SmartPtr(const SmartPtr& other) : ptr(other.ptr), refCount(other.refCount) {
        if (ptr) {
            ++(*refCount);
        }
    }

    SmartPtr& operator=(const SmartPtr& other) {
        if (this == &other) {
            return *this;
        }
        if (ptr && --(*refCount) == 0) {
            delete ptr;
            delete refCount;
        }
        ptr = other.ptr;
        refCount = other.refCount;
        if (ptr) {
            ++(*refCount);
        }
        return *this;
    }

    ~SmartPtr() {
        if (ptr && --(*refCount) == 0) {
            delete ptr;
            delete refCount;
        }
    }

    T& operator*() {
        return *ptr;
    }

    T* operator->() {
        return ptr;
    }

    bool operator==(const SmartPtr& other) const {
        return ptr == other.ptr;
    }

    bool operator!=(const SmartPtr& other) const {
        return ptr != other.ptr;
    }
};

// 测试代码
int main() {
    SmartPtr<MyClass> sp1(new MyClass(10));
    SmartPtr<MyClass> sp2(sp1);
    SmartPtr<MyClass> sp3;
    sp3 = sp2;

    sp1->printData();
    (*sp2).printData();
    sp3.printData();

    return 0;
}