“spécificateur de type manquant” erreur sur la déclaration du constructeur
J'ai 2 classes dans 2 fichiers différents:
RegMatrix.h:
#ifndef _RM_H
#define _RM_H
#include "SparseMatrix.h"
...
class RegMatrix{
...
RegMatrix(const SparseMatrix &s){...} //ctor
...
};
#endif
SparseMatrix.h:
#ifndef _SM_H
#define _SM_H
#include "RegMatrix.h"
...
class SparseMatrix{
...
SparseMatrix(const RegMatrix &r){...} //ctor
...
};
#endif
Sur le constructeur lignes j'obtiens les erreurs suivantes:
error C4430: spécificateur de type manquant - int supposé.
error C2143: erreur de syntaxe : manquant ',' avant '&'
Mais quand j'ajoute les classes déclarations
class SparseMatrix;
dans le RegMatrix.h fichier et
class RegMatrix;
dans le SparseMatrix.h de fichier, il fonctionne très bien.
Ma question est pourquoi est-il nécessaire, si j'ai le comprend?
10x.
Les identifiants
_RM_H
et _SM_H
sont reserved, ne les utilisez pas.OriginalL'auteur Sanich | 2010-09-27
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir circulaire n ° comprend (un fichier #inclut un autre qui #contient le premier fichier). Avant de se déclarer des classes à la place de la #include va briser la chaîne et lui permettre de travailler. Déclarer le nom de la classe qui permet d'utiliser le nom, sans avoir à connaître de l'intérieur les bits de la classe.
BTW, le désir de la circulaire n ° comprend une conception de l'odorat. Vous pourriez peut-être créer une interface que les deux classes peuvent dépendre de la place? Ils n'auront pas mutuellement dépendent les uns des autres.
non vous n'avez probablement pas. La déclaration anticipée est suffisant si tout ce que vous voulez, c'est une référence.
Dans le ctor im en utilisant un getter fonctions de l'autre classe pour obtenir ses membres privés, afin de ne pas y compris de l'autre classe ne fonctionnent pas.
Vous l'inclure dans le
.cpp
.OriginalL'auteur Michael Kristofik
Votre en-tête de l'inclusion ne fonctionne pas, voir ce qui se passerait si je comprend SparseMatrix.h après la résolution comprend:
Donc, fondamentalement, SparseMatrix est pas défini. Vous ne pouvez rien faire à ce sujet. Il suffit de déclarer votre classe avant de déclaration.
OriginalL'auteur BatchyX
Si vous incluez
RegMatrix.h
tout d'abord, il comprendraSparseMatrix.h
. Alors qui va aller retour, y comprisRegMatrix.h
, et de sauter parce que l'en-tête de la garde est définie. PuisSparseMatrix
continue à être définie, à l'exceptionRegMatrix
n'a même jamais été déclarée. Ensuite, vous obtenez un message d'erreur.Vous ne pouvez pas avoir circulaire comprend. Vous devez déclarer avant un ou deux d'entre eux, comme vous l'avez fait.
OriginalL'auteur GManNickG
Des déclarations comme
sont appelés les déclarations. Il indique au compilateur que "somehere" il y a une classe de ce nom. Il fait le bonheur du compilateur et fonctionne parfaitement tant que l'en avant de déclarer le fichier utilise un pointeur ou une référence à l'référencé vers l'avant de la classe. C'est parce que, à partir de compilateur point de vue, des pointeurs ou des références à seulement 4 octets quel que soit le contenu de classe.
À l'OP du code, à la fois
SparseMatrix
etRegMatrix
sont utilisées uniquement (const) les références, si avant, la déclaration est suffisante pour le faire fonctionner.Cependant, si l'en avant de déclarer fichier fait quelque chose qui nécessite le compilateur pour connaître sa taille, par exemple
puis le compilateur puisse se plaindre 🙂
Dans la situation particulière posée par l'OP, ma préférence va à abandonner la mutuelle
#include
complètement et la conception de l'interface basée sur les déclarations. La mise en œuvre (c'est à dire .fichiers cpp) peut ont pour inclure les fichiers d'en-tête, mais ce n'est pas un problème.OriginalL'auteur Arun