ожидаемое имя класса до маркера '{' без заголовков - PullRequest
0 голосов
/ 25 июля 2011

Я довольно запутался в ответах, которые я нашел в ответе на ошибку.

У меня есть один класс, от которого я хочу наследовать.Но когда я пытаюсь наследовать, я получаю указанную ошибку.Ни один из этих классов не использует заголовочные файлы, так как я делаю это только для того, чтобы узнать, как работают виртуальные переопределения.Я довольно новичок в C ++.Так что речь идет не о том, чтобы что-то сделать, а о том, как лучше понимать C ++.

Когда я ищу ответ в Google, обычно возникают проблемы с заголовочными файлами и ключевыми словами "#include".

И не так уж много кода для работы.Какие-либо предложения?

edit:

Как я уже сказал, не так много кода для работы, также и другие файлы, которые я не включил, ничем не отличаются от Pianist

   /* 
 * File:   main.cpp
 * Author: Sidar
 *
 * Created on 19 juli 2011, 17:51
 */

#include <cstdlib>
#include <iostream>
#include "Musician.cpp"
#include "Pianist.cpp"
#include "MasterPianist.cpp"
#include "JuniorPianist.cpp"


using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    Musician *m = new Musician();
    Pianist *p = new Pianist();
    //JuniorPianist *jp = new JuniorPianist();
    MasterPianist *mp  = new MasterPianist();
    //__________________________
    cout << "Pianist greets:\n";
    m->greet();
    cout << "And this is a:\n";
    m = p;
    m->greet();
    cout << "The pianist states his proffesion:\n";
    m = mp;
    m->greet();
    cout << "And this is his student:\n";
   // m = jp;
    m->greet();

    return 0;
}

Класс, который должен быть унаследован

    #include <iostream>
using namespace std;

class Musician{

public:
    //Constructors
    Musician(){}
    Musician(const Musician& m){}
    ~Musician(){}
    //Methods/Functions
    virtual void greet(){
        cout << "Hello";
    }
};

Класс, который пытается наследовать.

 /* 
 * File:   Pianonist.cpp
 * Author: Sidar
 * 
 * Created on 19 juli 2011, 17:58
 */

#include <iostream>
using namespace std;

class Pianist: public Musician {

public:
    Pianist(){}
    Pianist(const Pianist& orig){}
    ~Pianist() {}
    //____________________________________
    void greet(){
        cout << " This is  pianist";
    }
};

1 Ответ

0 голосов
/ 25 июля 2011

Кажется, что ваш class Pianist наследуется от Muscician в файле Pianist.cpp (который должен быть переименован в Pianist.hpp), но этот файл не включает Musician.cpp (который должен быть переименован в Musician.hpp), и поэтому не знает что такое Muscician Вы хотите включить определение Musicain в Pianist.hpp

Теперь, когда вы сделаете это, вы, вероятно, обнаружите, что компилятор пропустил каждый из этих файлов более одного раза, нарушив правило одного определения. Чтобы преодолеть это, вам нужно добавить include-guard для каждого из ваших включенных файлов. Попробуйте добавить #pragma once в качестве первой строки в каждый из заголовочных файлов. (обратите внимание, что #pragma однажды не является кроссплатформенной, но большинство реализаций поддерживают ее, поэтому с вами все будет в порядке, пока вы немного не познакомитесь с языком).

Короче говоря,

  1. Переименовать Musician.cpp -> Musician.hpp (аналогично для Пианиста). Это заголовочные файлы (вы включаете их в свой main.cpp)
  2. добавить #include "Musician.hpp" в Pianist.hpp (чтобы класс Musician мог найти определение (и реализацию) класса Musician.
  3. Добавьте #pragma once в начало всех ваших .hpp файлов.

затем выдайте любую ошибку компилятора, возникшую после того, как вы это сделали.

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