2010-10-09 16 views
1

En C++ j'ai 2 vecteurs STL A et V. A a des données et est en mesure de le changer, V seulement des points aux données, mais ne lit que et ne peut pas le modifier. Donc, si ces deux vecteurs sont à l'intérieur d'une classe ce sera la syntaxe deC++ comment faire deux vecteurs un avec des données les autres points et lit seulement

  1. définition Variables
  2. attribution A référence en V
  3. get_A() et get_V() sera elle renvoie une référence ou un pointeur?

également Si j'ai d'autres vecteurs normaux comme A, B, C et D suis-je capable de « insérer » leurs références dans V afin que V peut les voir un par un? Pour l'autorisation V.size() sera égale à A.size() + B.size() + C.size().


Désolé pour la confusion, je crois que je l'ai posé la question de mauvaise façon

+0

Cela ressemble beaucoup à ses devoirs. Si oui, s'il vous plaît ajouter une étiquette de devoirs. –

+0

Essayez-vous de permettre à un appelant client de voir les données sans les modifier? – rerun

+0

Demandez-vous réellement "quelle est la syntaxe de la définition et de l'affectation des variables?" ou essayez-vous de demander "comment puis-je implémenter l'initialisation et l'affectation de telle sorte que j'obtiens un certain comportement?" –

Répondre

1
  1. Les vecteurs seront déclarés comme

    vector<Data> A; 
    vector<const Data *> V; 
    

    (Notez que V ne peut pas être un vecteur de const Data & parce que les références ne sont pas cessibles et vecteur nécessite un type de modèle assignable.)

  2. L'affectation d'une référence de A à V ressemblerait à ceci:

    V[i] = &A[i]; 
    
  3. Je ne suis pas sûr de ce que vous voulez dire par get_A et get_V. Ma meilleure hypothèse est que vous faites référence à ce que les résultats de l'opérateur [] sur A et V sont. A[i] renvoie une référence à une donnée, c'est-à-dire Data&. V[i] renvoie techniquement une référence à un pointeur de données const, c'est-à-dire const Data * &, mais vous l'utiliserez effectivement comme un pointeur, c'est-à-dire un const Data *.

En ce qui concerne la question sur A, B et C: si elles sont les tous les vecteurs de même type, et ils ne changent pas la taille, vous pouvez configurer V pour contenir des pointeurs vers les éléments dans chacun des leur. Mais si elles changent de taille, ajouter un élément à, disons, A, après avoir défini V, signifierait que vous devrez insérer le pointeur sur le nouvel élément de A dans le décalage correct de V, ce qui est possible mais semble un tracas.

Un exemple rapide de la mise en place d'un tel V ressemblerait à ceci:

vector<Data const *> V; 
for (size_t i = 0; i < A.size(); ++i) { V.push_back(&A[i]); } 
for (size_t i = 0; i < B.size(); ++i) { V.push_back(&B[i]); } 
for (size_t i = 0; i < C.size(); ++i) { V.push_back(&C[i]); } 
+0

ouais c'est ce que je cherche merci compagnon –

0

Je crois que ce que vous décrivez est quelque chose comme un alias const pour le vecteur de données. Ce que je dis est que vous devez travailler avec une référence const au vecteur A.

Un exemple (complètement hors du bleu, mais décrit ma suggestion et la compréhension de la situation très bien):

class someClass 
{ 
public: 
    const std::vector & V() const 
    { 
     return A; 
    } 
private: 
    std::vector<int> A; 
}; 

D'après ce que je reçois de const ness, cette « protège » A par ne montrant que la const version lorsque quelqu'un "accède" le vecteur à travers someClass::V().