【问题标题】:How to set size for vector of self-defined object?如何设置自定义对象向量的大小?
【发布时间】:2013-07-25 18:00:25
【问题描述】:

我尝试在使用矢量之前设置大小,但得到错误信息:

错误 c2512: 'EItem:EItem' : 没有合适的默认构造函数可用

// file.h
vector<EItem > *eL;

// file.cpp
eL = new vector<EItem>(100);

我需要在我自己定义的对象EItem 中提供什么?

【问题讨论】:

  • 如错误消息所述,您需要一个默认构造函数。你有吗?
  • 如果我没有默认 ctor 怎么办?谢谢。
  • 或者,您可以使用new vector&lt;EItem&gt;(100, EItem(somestuff)) 使用临时EItem 的副本初始化您的向量。

标签: c++ vector constructor initialization default-constructor


【解决方案1】:

正如您的编译器所说的,您必须为您的EItem 类定义一个默认构造函数:

在 .h 中:

class EItem {
public:
    EItem(); // constructor

    // ...
};

在 .cpp 中:

EItem::EItem() {}

或多合一(在 .h 中):

class EItem {
public:
    EItem() {} // constructor

    // ...
};

这是最低限度。您可以在类中添加一些参数,并在构造函数中初始化类的一些属性。

在 C++ 中,默认构造函数很重要,因为它们在某些情况下会自动调用:

  • 当声明对象值时没有参数列表,例如MyClass x; 或没有参数列表的动态分配,例如new MyClassnew MyClass();默认构造函数用于初始化对象
  • 当声明对象数组时,例如MyClass x[10]; 或动态分配,例如new MyClass [10];默认构造函数用于初始化所有元素
  • 当派生类构造函数未在其初始化列表中显式调用基类构造函数时,将调用基类的默认构造函数
  • 当类构造函数未显式调用其初始化列表中的对象值字段之一的构造函数时,将调用该字段类的默认构造函数
  • 在标准库中,某些容器在未明确给出值时使用默认构造函数“填充”值(例如:vector&lt;MyClass&gt;(10);),用 10 个元素初始化向量,这些元素填充为默认值- 我们类型的构造值。

在上述情况下,如果类没有默认构造函数是错误的。

这个帖子也有一些很好的答案:When do we need to have a default constructor?

【讨论】:

    【解决方案2】:

    向量需要知道 EItem 占用了多少大小,因为向量使用数组。如果 EItem 类中不存在其他构造函数,则将提供默认构造函数。确保你已经定义了类并且构造函数是公共的。

    class EItem
    {
     public:
       EItem();
    };
    

    【讨论】:

      【解决方案3】:

      编译器为您指明了正确的方向:您的 类 EItem 没有默认构造函数 - 因此您应该提供一个。

      引用自here

      如果我们不声明默认构造函数然后 实例化我们的类?答案是 C++ 会为 我们的类实例,但不会初始化类的成员 (类似于声明 int、double 或其他 基本数据类型)。

      在不知道 EItem 类的定义的情况下,实现默认构造函数的最小示例是:

      class EItem {
      ...
      public:
          ...
          //this is a minimal default constructor
          EItem() {
              ...
              //initialize and set the values for any data members of the class here
              ...
          }
      ...
      }
      

      要了解更多关于这一点以及更重要的是为什么你应该总是在你的课程中提供一个,请参阅以下内容:

      http://en.wikipedia.org/wiki/Default_constructor

      【讨论】:

        【解决方案4】:

        你的类需要有一个不带参数的默认构造函数才能使用这样的向量。如果你没有默认构造函数,那么你需要创建一个指向你的类的指针向量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-04
          • 2012-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-29
          • 1970-01-01
          相关资源
          最近更新 更多