簡體   English   中英

為什么沒有調用此模板 class 的復制構造函數?

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

復制構造函數永遠不會被調用(我使用 g++ 和 -std=c++11):
指針.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;
    }
};

主.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 在 ullamcorper nisi。 Suspendisse id suscipit magna, eu pellentesque ligula。 Nullam aliquam pretium tellus, eget venenatis eros pharetra finibus。

main()中的任何代碼都沒有調用SharedPtr的復制構造函數:

  • SharedPtr<Entity> e0; 調用SharedPtr(T *ptr = nullptr)
  • SharedPtr<Entity> sharedEntity = new Entity(); 調用SharedPtr(T *ptr = nullptr)
  • e0 = sharedEntity; 調用未在SharedPtr中定義的operator=()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM