为什么不接受这种向量的分配?

时间:2011-10-16 20:15:44

标签: c++ syntax new-operator

所以我在类标题中声明了一个向量:

 ...
 private:
    vector<Instruction> instructions;
 ...

然后在构造函数的.cpp实现中,我尝试像这样初始化它:

 instructions = new vector<Instruction>();

Xcode告诉我:No viable overloaded '='

我基本上试图让这个类的行为像我在java中所期望的那样,其中类的实例保留了这个向量。这就是为什么我想使用new动态分配它,以确保它不会在堆栈或其他东西上丢失。感谢任何帮助,非常感谢。

7 个答案:

答案 0 :(得分:4)

为了完成您要执行的操作,instructions = new vector<Instruction>()行完全没必要。只需删除它。当构造一个类的实例时,向量将自动获得默认构造。

另一种方法是将instructions变为指针,但似乎没有任何理由在此处执行此操作。

答案 1 :(得分:3)

当你写

vector<Instruction> instructions;

您已经对类的用户使用的任何内存模型进行了实例化说明,例如

class YourClass
{
vector<Instruction> instructions;
};

...
int main()
{
   YourClass class1; // stack
   std::unique_ptr<YourClass> class2(new YourClass); // heap
...
}

答案 2 :(得分:2)

在课堂上,您宣布std::vector<Instruction>new vector<Instruction>();会向您返回std::vector<Instruction>*

答案 3 :(得分:2)

operator new返回一个指针,因此您的类型不匹配。

真正的问题是你正在做这件事。你有充分的理由动态分配那个载体吗?我对此表示怀疑,完全省略它,因为它将与您的类型实例一起分配。

答案 4 :(得分:1)

您有会员值,但是您尝试从vector<Instruction>*初始化它。从vector<Instruction>初始化它或将声明更改为指针。如果你走第二条路线,你需要观察the rule of three

您可能还希望从this list.

获得一本不错的C ++书籍

另外,我认为你的标题中有一个using namespace std;,这是不好的。

答案 5 :(得分:1)

除非你知道自己在做什么,否则不要在C ++中使用new。 (目前你没有这样做。)

而是使用自动对象。您已将instructions定义为自动对象。你只需要初始化它就像它是一个:

class wrgxl {
 public:
   wrgxl()
    : instructions() // this initializes the vector using its default constructor
   {
     // nothing needed here
   }
 ...
 private:
    vector<Instruction> instructions;
 ...
};

构造函数初始化列表中instructions的初始化是可选的,但是,如果您只想调用默认构造函数。所以在这种情况下,这就足够了:

wrgxl()
{
}

如果要动态分配矢量,则需要使instructions指向矢量。但这很少有意义,因为向量已经动态地分配了它的数据,但包装了这个,所以你不必处理由此产生的丑陋细节。
其中一个细节是,如果在类中有动态分配的对象,则必须担心该类的销毁,复制构造和复制分配。

正如Kerrek已经指出的那样,为了正确学习C ++,你需要 一本好的C ++书 Make your pick

答案 6 :(得分:0)

我认为你把C ++的语法混淆了。

首先,与许多语言不同,在堆栈上分配的变量(例如你的)通过调用默认构造函数来初始化,所以我怀疑你正在做的事情是不必要的。

其次,为了执行您要执行的操作,请使用以下语法:

instructions = vector<Instruction>();
然而,正如我所说,这可能是多余的(并且在非优化编译器上浪费,因为它可能同时调用构造函数和赋值运算符)。在sbi的答案中可以找到更好的方法。

第三,与C#不同,new运算符在堆上分配内存并返回指向新分配数据的指针。您的变量instructions不是指针,因此是错误。