我对手头的错误找到的答案感到困惑。
我有一个我想继承的课程。但是当我尝试继承时,我得到了上述错误。 这些类中没有一个使用头文件,因为我只是这样做来了解虚拟覆盖是如何工作的。我是C ++的新手。所以这不是关于实际制作某些东西,更像是更好地理解C ++。
当我在谷歌上寻找答案时,通常会出现头文件和“#include”关键字问题。
并没有太多代码可以使用。 有什么建议?
编辑:
就像我说没有太多的代码可以使用,我没有包含的其他文件与钢琴家没什么不同
/*
* 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";
}
};
答案 0 :(得分:0)
您的class Pianist
似乎继承了文件Muscician
中的Pianist.cpp
(应重命名为Pianist.hpp
),但该文件不包含Musician.cpp
(应该重命名为Musician.hpp
),因此不知道Muscician
是什么。
你想把Musicain的定义包含在Pianist.hpp
现在,当你这样做时,你可能会发现编译器已经多次传递了这些文件,破坏了一个定义规则。要解决此问题,您需要为每个包含的文件添加包含防护。尝试将#pragma once
添加为每个头文件的第一行。 (注意#pragma曾经不是跨平台的,但大多数实现都支持它,所以你应该没问题,直到你对这种语言更熟悉。)
简而言之,
#include "Musician.hpp"
添加到Pianist.hpp(因此音乐家类可以找到音乐家类的定义(和实现)。#pragma once
添加到所有.hpp
文件的顶部。然后在完成此操作后给出任何编译器错误。