【问题标题】:Vector of class type error类类型错误的向量
【发布时间】:2015-12-07 01:14:36
【问题描述】:

所以我试图将一个 int 推回我的向量,但这样做时我不断遇到很多错误。我知道如果我只是将我的向量设为“vector”类型,这将起作用,但我想知道如何使用对象向量来做到这一点,例如下面的对象。

我能做些什么来解决这个问题?

#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::vector::push_back(int&)'

[注意] void std::vector<_tp _alloc>::push_back(const value_type&) [与 _Tp = 类名; _Alloc = std::allocator; std::vector<_tp _alloc>::value_type = ClassName]

【问题讨论】:

  • 我不确定您要做什么。您打算如何将整数转换为ClassName
  • 如果你想依赖隐式类型转换,你需要一个构造函数ClassName(int)
  • 那么我应该如何使用 ClassName(int) 来实现呢?或者有什么办法解决这个问题?
  • 删除 c'tor 和 d'tor 定义。编译器将为您正确生成它们,并且每当您明确定义 d'tor 时,它都会隐式删除您需要的复制构造函数。
  • @Lex 看来您是新手,所以我想问一下ClassName 应该代表什么。一个类应该描述一些有形和明显的东西。在您的示例中,不清楚它是否应该描述某种树结构,或者它是否只是为了保存一堆整数。

标签: c++ class object vector stl


【解决方案1】:

正如@paddy 在 cmets 中指出的那样,您将需要一个构造函数来隐式转换为您的类型。您可以通过声明一个构造函数来实现此目的,该构造函数采用您希望转换为的类型的 single 参数:

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 类型的对象,这是您无法做到的。

让它工作的唯一方法是声明一个指向该类型的指针:

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;
};

【讨论】:

    【解决方案2】:

    标准库容器必须用完整类型实例化。

    所以一个类不可能包含自己的std::vectorvector&lt;ClassName&gt; m_Vector 行导致未定义的行为(不需要诊断)。

    您的选择是:

    • 使用允许不完整类型的非标准容器,例如Boost 容器
    • 使用您已经定义的不同类型的向量
    • 使用智能指针向量
    • 做你想做的事的不同方式

    根据您的示例代码,您可能需要vector&lt;int&gt; 而不是vector&lt;ClassName&gt;,这样可以避免这个问题。

    通常,包含自身容器的类没有语义意义(显然,大多数此类实例必须包含空容器,否则您将使用无限内存)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2018-04-22
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多