尝试理解类和标头

Ttrying to understand Classes and headers

本文关键字:      更新时间:2023-10-16

**问题已解决。看来我错误地创建了一个额外的标题,并且由于我删除了他,它起作用了。 **

所以我试图了解类和标题以及如何使它们协同工作。我正在遵循一个在线教程,但我的代码似乎出了点问题。问题是当我尝试运行main时,它会给我这个错误:Cat::speak()和所有其他功能的多重定义。

主.cpp

#include <iostream>
#include "class.h"
using namespace std;
int main()
{
    Cat jim;
    jim.makehappy();
    jim.speak();
    Cat george;
    george.makesad();
    george.speak();
    return 0;
}

类.cpp

#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;
}

类.h

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
class Cat
{
private:
    bool happy;
public:
    void makehappy();
    void makesad();
    void speak();
};
#endif // CLASS_H_INCLUDED

从你在这里展示的内容来看,应该没有问题。要暂时解决此问题以了解是否实际上在多个位置定义了此函数,您可以做的是将您的类包装在命名空间中。

类.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

类.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

主.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::命名空间使用范围解析运算符将有助于消除任何可能的问题和任何可能的未来问题。

你是如何编译代码的?在将它们链接在一起之前,您需要确保分别构建特定的"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

看起来您正在使用双重夹杂物防护装置,所以我认为这不是问题所在。查看此答案,以更深入地解释正在发生的事情: 函数的多个定义错误

相关文章:
  • 没有找到相关文章