为什么没有调用此模板类的复制构造函数?

Why is the copy constructor of this template class not getting called?

提问人:Спасимир Павлов 提问时间:5/31/2020 最后编辑:Спасимир Павлов 更新时间:5/31/2020 访问量:49

问:

复制构造函数永远不会被调用(我使用带有 -std=c++11 的 g++):
pointers.cpp:

#include <iostream>

template <typename T>
class SharedPtr
{
private:
    int *m_Count;
    T *m_Ptr;

public:
    SharedPtr(T *ptr = nullptr)
        : m_Count(new int), m_Ptr(ptr)
    {
        *m_Count = 1;
    }

    SharedPtr(const SharedPtr &other)
        : m_Count(other.m_Count), m_Ptr(other.m_Ptr)
    {
        std::cout << "Copied: " << *m_Count << std::endl;
        (*m_Count)++;
    }

    ~SharedPtr()
    {
        (*m_Count)--;
        if (*m_Count == 0)
        {
            delete m_Ptr;
            delete m_Count;
        }
    }

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

main.cpp:

#include "pointers.cpp"
#include <iostream>

class Entity
{
public:
    Entity()
    {
        std::cout << "Entity created!" << std::endl;
    }
    ~Entity()
    {
        std::cout << "Entity destroyed!" << std::endl;
    }
};

int main(int argc, char *argv[])
{
    {
        SharedPtr<Entity> e0;
        std::cin.get();
        {
            SharedPtr<Entity> sharedEntity = new Entity();
            std::cin.get();
            e0 = sharedEntity;
            std::cin.get();
        }
        std::cin.get();
    }

    std::cin.get();
}

我查看了这里提出的其他类似问题,但没有一个有效。 复制构造函数应该是 ,对吧?ClassName(const ClassName &other)

Lorem ipsum dolor sit amet, consectetur adipiscing elit.Aliquam lacinia mattis arcu, vitae interdum leo.Praesent viverra, tortor a tincidunt ullamcorper, arcu urna finibus enim, congue dignissim tortor quam ut dui.Ut eleifend suscipit ligula sagittis consequat.Integer semper orci eu metus mollis sodales.Fusce sollicitudin elementum nisl, non congue odio lobortis non.Duis tempus tristique nisi nec tempor.Sed in ullamcorper nisi.Suspendisse id suscipit magna, eu pellentesque ligula.Nullam aliquam pretium tellus, eget venenatis eros pharetra finibus.

C++ OOP 模板 复制 复制构造函数

评论

0赞 Igor Tandetnik 5/31/2020
e0 = sharedEntity;调用 Copy Assignment 运算符,而不是 Copy 构造函数。此行上未构建任何新实例。
0赞 Спасимир Павлов 5/31/2020
不知道我怎么没有看到。谢谢。

答:

0赞 Jeune Prime Origines 5/31/2020 #1

没有一个代码调用以下代码的复制构造器:main()SharedPtr

  • SharedPtr<Entity> e0;调用SharedPtr(T *ptr = nullptr)
  • SharedPtr<Entity> sharedEntity = new Entity();调用SharedPtr(T *ptr = nullptr)
  • e0 = sharedEntity;未在operator=()SharedPtr