【问题标题】:Why is the copy constructor of this template class not getting called?为什么这个模板类的复制构造函数没有被调用?
【发布时间】:2020-05-31 14:10:21
【问题描述】:

复制构造函数永远不会被调用(我使用带有 -std=c++11 的 g++):
指针.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 &amp;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。整数 semper orci eu metus mollis sodales。 Fusce sollicitudin elementum nisl,non congue odio lobortis non。 Duis tempus tristique nisi nec tempor。 Sed 在 ullamcorper nisi。 Suspendisse id suscipit magna, eu pellentesque ligula。 Nullam aliquam pretium tellus, eget venenatis eros pharetra finibus。

【问题讨论】:

  • e0 = sharedEntity; 调用复制赋值运算符,而不是复制构造函数。此行没有构建新实例。
  • 不知道我怎么没看到。谢谢。

标签: c++ oop templates copy copy-constructor


【解决方案1】:

main() 中的代码都没有调用SharedPtr 的复制构造函数:

  • SharedPtr&lt;Entity&gt; e0; 致电SharedPtr(T *ptr = nullptr)
  • SharedPtr&lt;Entity&gt; sharedEntity = new Entity(); 致电SharedPtr(T *ptr = nullptr)
  • e0 = sharedEntity; 调用 operator=() 未在您的 SharedPtr 中定义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 2011-11-16
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多