Domanda

Ho una classe modello Bambino che eredita da un non-implacato Genitore classe. Quando includo Bambinoistante in più file .cpp ottengo un errore LNK2005. Questo accade perché Genitore viene definito in più unità di compilation. Quando quelle unità vengono collegate insieme, causano l'errore LNK2005.

Nel caso ti stia chiedendo, lo scopo di Genitore è dare Bambino Una variabile statica per tutti Bambino istanza, non solo uno per ciascuno Figlio <'' type ''>.

La mia domanda è: come posso creare una classe modello che abbia un unico (su tutti Bambino istanze) Variabile statica e può essere inclusa in più file .cpp?

Ecco un esempio di giocattolo che provoca questo errore LNK2005:

main.cpp

#include "Apple.h"
#include "Banana.h"

#include <string>

void main() {
    Apple apple;
    Banana banana;
}

Apple.h

#ifndef APPLE_H
#define APPLE_H

struct Apple {
    Apple();
};

#endif // APPLE_H

Apple.cpp

#include "Apple.h"
#include "Child.h"

Apple::Apple() {
    Child<int> child;
    child.foo(5);
}

Banana.h

#ifndef BANANA_H
#define BANANA_H

struct Banana {
    Banana();
};

#endif // BANANA_H

Banana.cpp

#include "Banana.h"
#include "Child.h"

Banana::Banana() {
    Child<double> child;
    child.foo(3.14);
}

Child.h

#ifndef CHILD_H
#define CHILD_H

#include <iostream>

using namespace std;

///////////// Parent Class Def ///////////

class Parent {
    protected:
    static int id;
};

int Parent::id = 0;

///////////// Child Class Def ///////////

template <class T>
struct Child : protected Parent {
    Child();
    void foo(T t);
};

template <class T>
Child<T>::Child() {
    id++;
}

template <class T>
void Child<T>::foo(T t) {
    cout << "Child" << id << "'s foo() says: " << t << endl;
}

#endif // CHILD_H

Errore LNK2005: "Protetto: static int genitore :: id" (? id@parent @@ 1ha) già definito in Apple.obj

È stato utile?

Soluzione

Devi definire int Parent::id = 0; solo una volta dentro Child.C. Includendolo nell'intestazione viene definito una volta per file che include l'intestazione.

Suppongo che dovrei notare che tra i mali di metterlo dentro Parent.C (nome della classe corrispondente) o Child.C Abbinando il nome dell'intestazione, ho scelto coerenza. Molto meglio è mettere Parent nei suoi file in modo da poter mettere la definizione in un nome appropriato Parent.C che corrisponde ancora al nome dell'intestazione corrispondente.

Altri suggerimenti

Tiro

int Parent::id = 0;

fuori dentro Parent.cpp E starai bene. Quello che succede ora è che la definizione viene inclusa una volta per unità di traduzione che include Child.h.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top