简体   繁体   English

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

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

The copy constructor never gets called (I'm using g++ with -std=c++11):复制构造函数永远不会被调用(我使用 g++ 和 -std=c++11):
pointers.cpp:指针.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:主.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();
}

I looked at other similar questions asked here, but none of them worked.我查看了此处提出的其他类似问题,但没有一个有效。 The copy constructor should be ClassName(const ClassName &other) , right?复制构造函数应该是ClassName(const ClassName &other) ,对吧?

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

None of the code in main() calls the copy contructor of SharedPtr : main()中的任何代码都没有调用SharedPtr的复制构造函数:

  • SharedPtr<Entity> e0; calls SharedPtr(T *ptr = nullptr)调用SharedPtr(T *ptr = nullptr)
  • SharedPtr<Entity> sharedEntity = new Entity(); calls SharedPtr(T *ptr = nullptr)调用SharedPtr(T *ptr = nullptr)
  • e0 = sharedEntity; calls operator=() which is not defined in your SharedPtr调用未在SharedPtr中定义的operator=()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM