当我没有定义任何方法两次时,为什么我需要inline关键字?

时间:2018-06-05 02:45:22

标签: c++

我在C ++中练习继承和抽象。我有一个名为Animal的基类和一个名为Dog的派生类。当我试图将定义与基类的实现分开时,我遇到了麻烦。 基类Animal有一个接口(.h文件)和一个实现(.cpp文件)。

以下是Animal.h的代码 -

class Animal {

    const char * _name;
    int _numberInPack;
    int _numberOfLegs;

    Animal() {};

public:
    Animal(const char *, const int, const int);
    const char * nameOftheAnimal();
    int numberOfLegs();
    int numberInPack();
};  

和Animal.cpp如下 -

#include "stdafx.h"
#include "Animal.h"

Animal::Animal(const char *name, const int numberInPack, const int numberOfLegs) {
    _name = name;
    _numberInPack = numberInPack;
    _numberOfLegs = numberInPack;
}

const char * Animal::nameOftheAnimal() {
    return _name;
}
int Animal::numberOfLegs() {
    return _numberOfLegs;
}
int Animal::numberInPack() {
    return _numberInPack;
}

如果我这样做,我会收到以下错误。

LNK1169 one or more multiply defined symbols found.

这里发生了什么?

错误看起来像这样 -

enter image description here

如果我只是添加关键字inline,我就不会再收到错误了。象 -

public:
    inline Animal(const char *, const int, const int);
    inline const char * nameOftheAnimal();
    inline int numberOfLegs();
    inline int numberInPack();

这个inline关键字的作用是什么?

任何帮助都会非常感激。

我的main.cpp正在关注 -

#include "stdafx.h"
#include "Animal.cpp"


int main()
{
    Animal an("Tommy", 5, 4);
    printf("The animal has %d legs\n", an.numberOfLegs() );


    return 0;
}

1 个答案:

答案 0 :(得分:3)

问题在于#include "Animal.cpp"中的main.cpp。这意味着函数定义将包含在main.cppAnimal.cpp的对象文件中。

正确的方法是在#include "Animal.h""Animal.cpp"(而不是main.cpp),然后告诉链接器包含从{{1}创建的目标文件}和main.cpp

在声明中添加Animal.cpp似乎有效的原因是编译器将内联函数而不是生成由链接器整理的目标代码。这种方法的问题在于,现在你必须在每个使用它们的源文件中包含所述函数的定义。

你的一些功能很适合内联,因为它们很短。例如。 inlinenameOftheAnimal()numberOfLegs()

如果要内联它们,可以将函数定义添加到numberInPack()(并从"Animal.h"中删除)。