ошибка C2440: «инициализация»: невозможно преобразовать из «имя класса» в «имя класса» - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть определенный класс, названный extBlock.

Затем я создаю экземпляр этого класса с этим

extBlock mainBlock = new extBlock(1, 1024);

Я получаю эту ошибку: ошибка C2440: «инициализация»: невозможно преобразовать из «extBlock *» в «extBlock»

Может ли кто-нибудь помочь мне с тем, почему я получаю эту ошибку.

Я видел в Интернете примеры объявления этого с помощью указателя

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

Но если я делаю это таким образом, это не позволяет мне вызывать функции mainBlock

Ответы [ 6 ]

13 голосов
/ 16 апреля 2010

Читайте о вашем синтаксисе 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
9 голосов
/ 16 апреля 2010

Переключение с 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 ++ вместо 1011 можно использовать a->b:

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

Кроме того, C ++ по умолчанию не имеет сборки мусора, поэтому вам необходимо явно освободить delete:

delete mainBlock;
7 голосов
/ 16 апреля 2010

Это не C #: new extBlock возвращает указатель на extBlock, и вы пытаетесь присвоить этот указатель типу значения (который был бы несовместимым приведением).

Что вы хотите написать здесь

extBlock mainBlock(1, 1024);

И причина, по которой вы не могли вызывать методы во втором фрагменте кода, вероятно, была в том, что вы использовали оператор . вместо оператора -> ( arrow ), необходимого для разыменования указателя.

1 голос
/ 16 апреля 2010

new возвращает указатель на выделенную память, где конструктор инициализировал ваш объект. Таким образом вам нужно использовать extBlock *mainBlock = new extBlock(1, 1024);. Вы можете вызвать методы впоследствии через mainBlock->someMethod() или (*mainBlock).someMethod().

1 голос
/ 16 апреля 2010

Вы хотите это, как у вас было:

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

но затем вы вызываете функции, используя -> вместо ., например:

* +1007 *

Не забудьте удалить его, когда он больше не нужен.

delete mainBlock;
0 голосов
/ 16 апреля 2010

Ключевое слово new всегда назначает указатель.Вам нужно сделать что-то вроде этого:

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

Поскольку mainBlock теперь является указателем, оператор . больше не будет работать для ссылки на поля или методы, и необходимо использовать оператор ->на своем месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...