所以我试图将一个int推送到我的向量中但是我这样做会遇到很多错误。我知道如果我把我的矢量变成“vector< int>”就行了类型,但我想知道如何使用对象矢量,如下面的内容。
我该怎么做才能解决这个问题?
#include <iostream>
#include <vector>
using namespace std;
class ClassName
{
public:
ClassName()
{}
~ClassName()
{}
void AddInt(int num)
{
m_Vector.push_back(num);
}
private:
vector<ClassName> m_Vector;
};
int main()
{
// Create our class an add a few ints
ClassName obj;
obj.AddInt(32);
obj.AddInt(56);
obj.AddInt(21);
return 0;
}
我得到的错误:
[错误]没有匹配的调用功能 '的std ::矢量::的push_back(INT&安培)'
[注意] void std :: vector&lt; _Tp,_Alloc&gt; :: push_back(const value_type&amp;) [使用_Tp = ClassName; _Alloc = std :: allocator; std :: vector&lt; _Tp,_Alloc&gt; :: value_type = ClassName]
答案 0 :(得分:0)
正如@paddy在评论中指出的那样,你需要一个能隐式转换为你的类型的构造函数。您可以通过声明一个构造函数来执行此操作,该构造函数采用您希望转换为的类型的单个参数:
class MyInt
{
public:
MyInt(int i) : number(i) {}
private:
int number;
};
可以使用如下:
int main()
{
std::vector<MyInt> numbers;
numbers.push_back(1);
numbers.push_back(42);
numbers.push_back(MyInt(4)); // explicit conversion
}
但是,即使在添加构造函数之后,您当前设计将面临的主要问题是您在ClassName
内声明了ClassName
类型的对象,而您无法做到这一点。< / p>
使这个工作的唯一方法是声明一个指向类型的指针:
int main()
{
std::vector< std::unique_ptr<MyInt> > v;
v.push_back(std::make_unique<MyInt>(42));
}
哪会让你上课:
class MyInt
{
public:
MyInt() : n(0) {}
MyInt(int i) : n(i) {}
void AddInt(int i)
{
numbers.push_back(std::make_unique<MyInt>(i));
}
private:
int n;
std::vector< std::unique_ptr<MyInt> > numbers;
};
但这没有意义。我不明白为什么你希望课程ClassName
有一个ClassName
的向量来存储数字;但是,如果你有一个持有int
的类(参见我之前的MyInt
示例)然后有一个MyIntContainer
类,它可以正常工作,具有以下内容:
class MyIntContainer
{
public:
void AddInt(int i)
{
numbers.push_back(i);
}
private:
std::vector<MyInt> numbers;
};
答案 1 :(得分:0)
标准库容器必须使用完整类型进行实例化。
因此,类不可能包含std::vector
本身。行vector<ClassName> m_Vector
导致未定义的行为(无需诊断)。
您的选择是:
根据您的示例代码,您似乎可能需要vector<int>
而不是vector<ClassName>
,这样可以避免此问题。
通常,对于包含自身容器的类来说,它没有语义意义(显然,大多数此类实例必须包含一个空容器,否则您将使用无限内存)。