为什么这个模板 class 的复制构造函数没有被调用?
Why is the copy constructor of this template class not getting called?
永远不会调用复制构造函数(我正在使用 g++ 和 -std=c++11):
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();
}
我查看了此处提出的其他类似问题,但其中 none 有效。
拷贝构造函数应该是ClassName(const ClassName &other)
吧?
事实是痛苦本身很重要,它会被肥胖的精英所追求。弓属性的一些lacinia,有时是生命的时间。 Praesent viverra, tortor a tincidunt ullamcorper, arcu urn finnibus, congue dignissim tortor quam ut dui.作为一个精灵,他拿起了一系列小箭。整个团队总是害怕足球。 Fusce sollicitudin element nisl,没有作业就没有仇恨政策。你有悲伤的时候,但不是时候。但只是在子宫里。这需要很多关注,这是一支伟大的足球队。土地是无价的,它需要大地的毒药和边界的颤抖
None main()
中的代码调用了 SharedPtr
的复制构造函数:
SharedPtr<Entity> e0;
呼叫 SharedPtr(T *ptr = nullptr)
SharedPtr<Entity> sharedEntity = new Entity();
呼叫 SharedPtr(T *ptr = nullptr)
e0 = sharedEntity;
调用 operator=()
,这在您的 SharedPtr
中未定义
永远不会调用复制构造函数(我正在使用 g++ 和 -std=c++11):
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();
}
我查看了此处提出的其他类似问题,但其中 none 有效。
拷贝构造函数应该是ClassName(const ClassName &other)
吧?
事实是痛苦本身很重要,它会被肥胖的精英所追求。弓属性的一些lacinia,有时是生命的时间。 Praesent viverra, tortor a tincidunt ullamcorper, arcu urn finnibus, congue dignissim tortor quam ut dui.作为一个精灵,他拿起了一系列小箭。整个团队总是害怕足球。 Fusce sollicitudin element nisl,没有作业就没有仇恨政策。你有悲伤的时候,但不是时候。但只是在子宫里。这需要很多关注,这是一支伟大的足球队。土地是无价的,它需要大地的毒药和边界的颤抖
None main()
中的代码调用了 SharedPtr
的复制构造函数:
SharedPtr<Entity> e0;
呼叫SharedPtr(T *ptr = nullptr)
SharedPtr<Entity> sharedEntity = new Entity();
呼叫SharedPtr(T *ptr = nullptr)
e0 = sharedEntity;
调用operator=()
,这在您的SharedPtr
中未定义