我有一个名为extBlock的类。
然后我用这个
创建该类的实例extBlock mainBlock = new extBlock(1, 1024);
我收到此错误: 错误C2440:'初始化':无法从'extBlock *'转换为'extBlock'
任何人都可以帮助我解决为什么我会收到此错误。
我在网上看过一些用指针声明它的例子
extBlock *mainBlock = new extBlock(1, 1024);
但如果我这样做,它不会让我调用mainBlock的函数
答案 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现在是一个指针,.
运算符将不再用于引用字段或方法,并且必须使用->
运算符。