错误C2440:'初始化':无法从'classname *'转换为'classname'

时间:2010-04-16 16:23:45

标签: c++ class instance

我有一个名为extBlock的类。

然后我用这个

创建该类的实例
extBlock mainBlock = new extBlock(1, 1024);

我收到此错误:  错误C2440:'初始化':无法从'extBlock *'转换为'extBlock'

任何人都可以帮助我解决为什么我会收到此错误。

我在网上看过一些用指针声明它的例子

extBlock *mainBlock = new extBlock(1, 1024);

但如果我这样做,它不会让我调用mainBlock的函数

6 个答案:

答案 0 :(得分:13)

阅读您的C ++语法:

extBlock mainBlock(1, 1024); // create a class instance (object) on the stack
mainBlock.memberFunction(); // call a member function of a stack object

extBlock * ptrBlock = new extBlock(1, 1024); // create an object on the heap
ptrBlock->memberFunctions(); // member access through pointers has different syntax
delete ptrBlock; // must deallocate memory when you're done with a heap object

答案 1 :(得分:9)

从Java / C#切换?

在C ++中,要初始化堆栈上的对象,只需使用

即可
extBlock mainBlock (1, 1024);
...
mainBlock.call_func(1,2,4,7,1);

new运算符在堆上创建一个对象,并返回指向它的指针。要从指针访问函数,您需要使用*取消引用它:

extBlock* mainBlock = new extBlock(1,1024);
...
(*mainBlock).call_func(1,2,4,7,1);

在C和C ++中,可以使用a->b代替(*a).b

mainBlock->call_func(1,2,4,7,1);

此外,默认情况下,C ++没有垃圾收集,因此您需要明确地释放delete

delete mainBlock;

答案 2 :(得分:7)

这不是C#:new extBlock返回指向extBlock的指针,并且您正在尝试将该指针指定给值类型(这将是一个不兼容的转换)。

你想在这里写的是

extBlock mainBlock(1, 1024);

您无法在第二个代码段上调用方法的原因可能是因为您使用.运算符而不是->arrow)运算符来取消引用指针。

答案 3 :(得分:1)

你想要这个,就像你一样:

extBlock *mainBlock = new extBlock(1, 1024);

然后您使用->而不是.来调用函数,如下所示:

mainBlock->FunctionOnIt(...);

不要忘记在不再需要时将其删除。

delete mainBlock;

答案 4 :(得分:1)

new返回指向已分配内存的指针,构造函数已初始化您的对象。因此,您需要使用extBlock *mainBlock = new extBlock(1, 1024);。您可以稍后通过mainBlock->someMethod()(*mainBlock).someMethod()调用这些方法。

答案 5 :(得分:0)

new关键字总是分配给指针。你需要做的是这样的事情:

extBlock *mainBlock = new extBlock(1, 1024);
mainBlock->functionName();

由于mainBlock现在是一个指针,.运算符将不再用于引用字段或方法,并且必须使用->运算符。