..\animal.cpp:-1: ошибка: multiple definition of `Animal::_totalAnimal'

263
27 февраля 2018, 05:56

3 файла:

main.cpp

#include <iostream>
#include "animal.h"
using namespace std;
int main()
{
    cout << "Hello World!" << endl;
    return 0;
}

animal.h

#ifndef ANIMAL_H
#define ANIMAL_H
#include <string>
using namespace std;
class Animal
{
protected:
    string _name;
    int _age;
    bool _isMan;
    static int _totalAnimal;
public:
    Animal();
    Animal(string name, int age, bool isMan);
    Animal(const Animal & obj); // конструктор копирования
    ~Animal();
    void setName(string name);
    void setAge(int _age);
    void setMan(bool _isMan);
    string getName() const;
    int getAge() const;
    bool getMan() const;
    static int totalAnimal();
    virtual string get_type() const = 0;
    friend ostream& operator<<(ostream& os, const Animal& dt);
};
int Animal::_totalAnimal = 10;
#endif // ANIMAL_H

animal.cpp

#include "animal.h"

Animal::Animal() { Animal::_totalAnimal++; }
Animal::Animal(string name, int age, bool isMan) {
    Animal::_totalAnimal++;
    setName(name);
    setAge(age);
    setMan(isMan);
}
Animal::Animal(const Animal & obj) {
    _name = obj._name;
    _age = obj._age;
    _isMan = obj._isMan;
}
Animal::~Animal() {
    Animal::_totalAnimal--;
}
void Animal::setName(string name) {
    if (name != "")
        _name = name;
    else
        throw 1;
}
void Animal::setAge(int age) {
    if (age >= 0)
        _age = age;
    else
        throw 2;
}
void Animal::setMan(bool isMan) {
    _isMan = isMan;
}
string Animal::getName() const { return _name; }
int Animal::getAge() const { return _age; }
bool Animal::getMan() const { return _isMan; }
int Animal::totalAnimal() { return Animal::_totalAnimal; }

Выдает 3 ошибки:

C:\Users\q\Documents\QT Project\pesok\animal.cpp:-1: ошибка: multiple definition of `Animal::_totalAnimal'
C:\Users\q\Documents\QT Project\pesok\main.cpp:-1: first defined here
collect2.exe:-1: ошибка: error: ld returned 1 exit status

Еще кому интересно pro-файл в проекте QT:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp \
    animal.cpp
HEADERS += \
    animal.h
Answer 1

Вот это вот определение

int Animal::_totalAnimal = 10;

у вас находится в h-файле, который включается в два .cpp-файла и, таким образм, вы имеете два определения одного и того же статического члена, и, соответственно, нарушение правила одного определения.

Перенесите его в один (и только в один) .cpp-файл.

Если у вас С++17, можно также определить статический член прямо в классе с использованием ключевого слова inline.

READ ALSO
Как разбить файл на qt

Как разбить файл на qt

Имеется большой лог файлКак разбить лог файл на несколько файлов

259
Возвращаемый шаблонной функцией тип

Возвращаемый шаблонной функцией тип

В книге Стенли Липпмана(Базовый курс по с++) написано, что если тип возвращаемый шаблонной функцией отличается от типа параметра шаблона,...

271
LLVM &amp; Clang++ AST

LLVM & Clang++ AST

Установил Clang по гайду и обнаружил, что LLVM\include нет папок clang и llvm (есть clang-с и llvm-с)

252
В массиве выводится мусор (Задача на нахождение одинаковых элементов в динамических массивах)

В массиве выводится мусор (Задача на нахождение одинаковых элементов в динамических массивах)

Дано два динамических массива одинаковой размерностиНужно вывести массив с одинаковыми элементами этих массивов

260