如何解决如果对象是用模板创建的,那么调用构造函数是不可能的吗?
当我试图理解c ++中的指针内容时,我写了一些简单的代码。我发现构造函数不起作用。 我不知道这里发生了什么。
template <typename T>
class Node
{
public:
T* Data;
Node<T>* right;
Node<T>* left;
};
class SimpleClass
{
public:
SimpleClass()
{
data = 0;
std::cout << "\n\t Get Resources!\n";
}
SimpleClass(int _value)
: data(_value)
{}
~SimpleClass() { std::cout << "\n\t Return Resources! \n"; }
void SetValue(int _value)
{
data = _value;
}
void Print()
{
std::cout << "\n\t Value : " << this->data << "\n";
}
private:
int data;
};
这是主要功能
int main(void)
{
Node<SimpleClass>* A = new Node<SimpleClass>[1];
Node<SimpleClass>* temp = new Node<SimpleClass>[1];
return 0;
}
我希望A
和temp
每次都调用构造函数,但不会。为什么呢?
解决方法
因为您为类节点创建一个对象,而不创建任何类SimpleClass的对象,所以不会调用此类的构造函数。
int main(void)
{
Node<SimpleClass>* A = new Node<SimpleClass>[1];
Node<SimpleClass>* temp = new Node<SimpleClass>[1];
A->Data = new SimpleClass();
temp->Data = new SimpleClass(10);
return 0;
}
,您正在创建2个Node<SimpleClass>
类型的对象,并且该类的构造函数被调用了两次。您可以通过以下方式进行验证:
#include <iostream>
template <typename T>
class Node
{
public:
Node() { std::cout << "Node constructor\n"; }
T* Data;
Node<T>* right;
Node<T>* left;
};
class SimpleClass
{
public:
SimpleClass()
{
data = 0;
std::cout << "\n\t Get Resources!\n";
}
SimpleClass(int _value)
: data(_value)
{}
~SimpleClass() { std::cout << "\n\t Return Resources! \n"; }
void SetValue(int _value)
{
data = _value;
}
void Print()
{
std::cout << "\n\t Value : " << this->data << "\n";
}
private:
int data;
};
int main(void)
{
Node<SimpleClass>* A = new Node<SimpleClass>[1];
Node<SimpleClass>* temp = new Node<SimpleClass>[1];
delete[] temp;
delete[] A;
return 0;
}
如果您要调用SimpleClass
的构造函数,则应创建此类型的对象,例如与:
#include <iostream>
template <typename T>
class Node
{
public:
Node() { std::cout << "Node constructor\n"; }
T* Data;
Node<T>* right;
Node<T>* left;
};
class SimpleClass
{
public:
SimpleClass()
{
data = 0;
std::cout << "\n\t Get Resources!\n";
}
SimpleClass(int _value)
: data(_value)
{}
~SimpleClass() { std::cout << "\n\t Return Resources! \n"; }
void SetValue(int _value)
{
data = _value;
}
void Print()
{
std::cout << "\n\t Value : " << this->data << "\n";
}
private:
int data;
};
int main(void)
{
Node<SimpleClass>* A = new Node<SimpleClass>[1];
Node<SimpleClass>* temp = new Node<SimpleClass>[1];
A->Data = new SimpleClass;
delete A->Data;
delete[] temp;
delete[] A;
return 0;
}
,
您的Node
不包含T
(或在本例中为SimpleClass
)-它包含指向T
的指针。因此,构造了Node
并构造了它包含的指针,而没有构造T
(SimpleClass
)。
您可以将T* Data;
更改为T Data;
,您会看到SimpleClass
被构造,或者为Node
提供了创建新T
的构造函数。 / p>
类似这样:
template <typename T>
class Node
{
public:
T Data;
Node<T>* right;
Node<T>* left;
};
or
template <typename T>
class Node
{
public:
Node() : Data{ new T() } {}
T* Data;
Node<T>* right;
Node<T>* left;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。