**问题解决了。似乎我错误地创建了一个额外的标题,因为我删除了它,它起作用了。 **
所以我试图了解类和标题以及如何使它们一起工作。
我正在关注一个在线教程,但似乎我的代码中出现了问题。
问题是,当我尝试运行main
时,它会给我这个错误:
Cat::speak()
的多重定义以及所有其他功能。
#include <iostream>
#include "class.h"
using namespace std;
int main()
{
Cat jim;
jim.makehappy();
jim.speak();
Cat george;
george.makesad();
george.speak();
return 0;
}
#include <iostream>
#include "class.h"
using namespace std;
void Cat::speak()
{
if (happy)
{
cout << "meoww" << endl;
}
else
{
cout << "sssss" << endl;
}
}
void Cat::makehappy()
{
happy = true;
}
void Cat::makesad()
{
happy = false;
}
#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
class Cat
{
private:
bool happy;
public:
void makehappy();
void makesad();
void speak();
};
#endif // CLASS_H_INCLUDED
答案 0 :(得分:1)
你是如何编译代码的?在将它们链接在一起之前,您需要确保单独构建特定的“class.o”和“main.o”文件。这是一个Makefile示例。
all: main
main: main.o class.o
g++ main.o class.o -o main
main.o: main.cpp class.h
g++ -c main.cpp
class.o: class.cpp class.h
g++ -c class.cpp
看起来你正在使用双重包含警卫,所以我不认为这是问题所在。请查看此答案,以便更深入地了解正在发生的事情:Error with multiple definitions of function
答案 1 :(得分:1)
根据你在这里展示的内容,应该没有问题。你可以做些什么来暂时解决这个问题,看看你是否真的在几个地方定义了这个函数,就是把你的类包装在命名空间中。
<强> class.h 强>
#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
namespace myNamespace {
class Cat {
private:
bool happy;
public:
void makehappy();
void makesad();
void speak();
};
} // namespace myNamespace
#endif // CLASS_H_INCLUDED
<强> class.pp 强>
#include <iostream>
#include "class.h"
// using namespace std; // Don't Use - This is Bad Practice
// Can cause name clashing when trying to resolve name lookup
namespace myNamespace {
void Cat::speak() {
if (happy) {
std::cout << "meoww" << std::endl;
} else {
std::cout << "sssss" << std::endl;
}
}
void Cat::makehappy() {
happy = true;
}
void Cat::makesad() {
happy = false;
}
} // namespace myNamespace
<强>的main.cpp 强>
#include <iostream>
#include "class.h"
// using namespace std; // Again -Bad Practice
int main() {
using namespace myNamespace;
Cat jim;
jim.makehappy();
jim.speak();
Cat george;
george.makesad();
george.speak();
return 0;
}
尝试此操作以查看是否收到相同的编译器错误。这可以帮助您查看是否在多个空间中定义此函数。另外,删除using namespace std;
并仅使用范围解析运算符到std::
命名空间将有助于消除任何可能的问题以及任何可能的未来问题。