所以我在类标题中声明了一个向量:
...
private:
vector<Instruction> instructions;
...
然后在构造函数的.cpp实现中,我尝试像这样初始化它:
instructions = new vector<Instruction>();
Xcode告诉我:No viable overloaded '='
我基本上试图让这个类的行为像我在java中所期望的那样,其中类的实例保留了这个向量。这就是为什么我想使用new
动态分配它,以确保它不会在堆栈或其他东西上丢失。感谢任何帮助,非常感谢。
答案 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
不是指针,因此是错误。