2014-01-13 2 views
0

У меня возникла проблема с этой ошибкой, и добавление конструктора по умолчанию не исправляет его. компиляция без конструкторов по умолчанию создает ошибку, компиляция с конструкторами по умолчанию создает ошибку. Я искал в Интернете часами, но ничего не нашел. Вот краткий пример моего кода (Фактический код довольно долго):Ошибка C2512 'DerivedClass': нет подходящего конструктора по умолчанию

//Header.h 
using namespace std; 

class BaseClass; 
class DerivedClass; 

BaseClass *MyClass = new DerivedClass; 

class BaseClass 
{ 
    virtual void myFunction() 
    { 
     cout << "Base Class"; 
    } 
}; 

class DerivedClass : public BaseClass 
{ 
    void myFunction() 
    { 
     cout << "Derived Class"; 
    } 
}; 

//Main.cpp 
#include <iostream> 
#include "Header.h" //I believe this gives Header.h access to iostream 
        //I believe it cause it works 

using namespace std; 

int main() 
{ 
    cout << "Hello"; 
} 

Ошибка в header.h, Main только там, чтобы дать доступ к header.h iostream. Как я уже сказал, я ищу ЧАСЫ. И не нашли никаких способов исправить ошибку: Ошибка C2512: «DerivedClass»: нет подходящего конструктора по умолчанию

+0

'новый DerivedClass' требует' определение DerivedClass'. У вас есть только декларация. Вам также нужно '#include ' в 'Header.h'. – juanchopanza

ответ

1

Зачем вам это нужно в заголовочном файле?

Baseclass *MyClass = new DerivedClass; 

Очевидно, компилятор ищет определения derived класса и не найден до этой линии выполняется.

Переместить его после внедрения derived класса или в main.

0
Baseclass *MyClass = new DerivedClass; 

должен прийти после определения классов, то есть конец файла

P.S. ваш комментарий в коде (о предоставлении доступа к iostream) является правильным. Но подумайте, что это не хорошая практика. Файлы заголовков должны компилироваться без каких-либо реквизитов для разных включений.

экземпляр объекта MyClass в пределах .h тоже нехорошо.

+0

Перемещение вокруг вызывает гораздо больше ошибок. ставя BaseClass * MyClass = новый DerivedClass в глобальную область main дает мне 8 ошибок. Ошибка c2512 все еще существует, и она добавляет ошибку C2605: «MyClass»: неопределенный идентификатор, а также Error C2541: «delete»: нельзя удалить объект, который не является указателем при попытке удалить MyClass, чтобы присвоить ему другой производный класс. – Shadow

+0

http : //coliru.stacked-crooked.com/a/a483680b2e110a2f попробуйте здесь –

+0

также, измените Baseclass на BaseClass, я не заметил его до –

0

Ваша программа полностью недействительна.

Вы выделяете память для класса DerivedClass, но пока не определена.

Baseclass *MyClass = new DerivedClass; 

Вы можете использовать стандартный выходной поток

cout << "Base Class"; 

но пока не объявлена, поскольку нет соответствующего заголовка, где объявлен поток.

Определение функции myFunction не имеет смысла, поскольку оно имеет контроль частного доступа и не может быть вызвано внешними методами самого класса, но такого метода нет.

Правильный код может выглядеть следующим образом

//Header.h 
#include <iostream> 
using namespace std; 

class BaseClass 
{ 
public: 
    virtual void myFunction() const 
    { 
     cout << "Base Class"; 
    } 
}; 

class DerivedClass : public BaseClass 
{ 
public: 
    void myFunction() const 
    { 
     cout << "Derived Class"; 
    } 
}; 

//Main.cpp 
#include <iostream> 
#include "Header.h" //I believe this gives Header.h access to iostream 
        //I believe it cause it works 

using namespace std; 

Baseclass *MyClass = new DerivedClass; 

int main() 
{ 
    cout << "Hello"; 
} 
+0

Это лучший пример того, что я пытаюсь сделать, я готов отказаться и использовать ifs http: // ideone.com/ogt3cu – Shadow

+0

@ user3189142 Удачи. –

+0

Угадайте, я использую ifs, тогда, спасибо за попытку помочь хотя – Shadow

Смежные вопросы