尝试理解类和标题

时间:2016-03-30 15:27:16

标签: c++ header

**问题解决了。似乎我错误地创建了一个额外的标题,因为我删除了它,它起作用了。 **

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

的main.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;
}

class.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;
}

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

2 个答案:

答案 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::命名空间将有助于消除任何可能的问题以及任何可能的未来问题。