0
votes

Puis-je passer 0 à une fonction attente d'un paramètre de type vecteur?

J'ai une fonction, comme tel: xxx

comme on peut le voir, vect est laissé seul, sauf si checkint est supérieur à 0 . Donc, si je veux passer checkint 0, alors il semble que je n'aurais pas à vous inquiéter de vect .

il semblerait donc Pour moi, j'ai besoin d'une valeur nominale pour aller dans cette fonction pour Vect , de sorte quelle valeur fonctionnerait, ou dois-je réussir un vecteur factice? Mon idée était de simplement passer 0, mais je suppose que cela ne fonctionnerait pas.

J'ai essayé de le jeter, comme dans foo (0, (vecteur ) 0,0) , mais j'ai été surpris que lorsque j'ai essayé d'imprimer VOCT , il vient d'être affiché comme vide (non 0 à l'intérieur), avec la fonction écrite comme suit: xxx

Comment devrais-je aller à ce sujet? < / p>

Je travaille avec C ++ 98.


6 commentaires

On dirait que vous avez besoin de deux fonctions distinctes


Qu'est-ce que "faire quelque chose pour vecter"? Modifier VECH?


@Jabberwocky La fonction que j'essaie de reproduire (c'est dans une autre langue) copie le contenu de VECT à un autre vecteur - c'est le "faire quelque chose à vecter"


(vecteur ) 0 résout réellement à un static_cast , qui est juste une manière étrange d'appeler constructeur n ° 2 ici , dont le paramètre est la taille souhaitée.


Peut-être que si vous changez de la signature de votre fonction en VOID FOO (int, Vecto *, int x) Vous passez null comme paramètre vectoriel.


@TryBghost si VOCT est uniquement lu, alors votre fonction doit être: Void FOO (int Checkint, Const Vecteur & Vect, int x) . Mais vous pouvez passer juste n'importe quel vecteur comme valeur nominale de toute façon.


3 Réponses :


2
votes

Modifier la déclaration de fonction pour accepter une référence du vecteur pour éviter de copier de la mémoire inutilement comme: xxx

si vous avez déjà un objet vectoriel, vous pouvez passer cela même s'il n'est pas utilisé. Si vous devez construire un vecteur factice, vous pouvez appeler la fonction comme ceci: xxx


2 commentaires

Cela ne compilera même pas. Les temporaires ne peuvent pas se lier à des références mutables.


@Samvarshavchik Vous avez raison, j'ai négligé cela; édité.



2
votes

Le code semble que la fonction décide si le vecteur est utilisé ou non, mais ce que vous voulez faire suggère que c'est l'appelant qui décide si le vecteur est utilisé ou non. Qui est-ce vraiment? Je pense que vous avez un problème de conception, corrige que vous n'avez plus besoin de lancer plus de 0 à un vecteur. (par exemple, faire deux fonctions, une prise d'un vecteur, l'autre ne prenant aucun vecteur comme paramètre)

Quoi qu'il en soit, vous voudrez peut-être regarder std :: en option qui n'est disponible que depuis C ++ 17, mais cela pourrait vous inspirer de la manière de gérer une telle situation de manière propre. La méthode "sale" est de passer un pointeur, puis de vérifier si c'est un nullptr à l'intérieur de la fonction.

Vos couts ne créent pas de vecteur rempli de 0 mais un vecteur avec la taille 0 .


0 commentaires

0
votes

Vous pouvez fournir une surcharge pouvant être appelée sans le vecteur. Vous pouvez refacturer la partie commune dans une sous-fonction:

void foo(int checkInt, vector<int> vect, int x) {
    if (checkInt > 0) {
         bar(checkInt, x);
         //do something to vect
    } else {
        foo(checkInt, x);
    }
}

void foo(int checkInt, int x) {
    assert(checkInt <= 0);   // maybe unnecessary. depends on what you need
    bar(checkInt, x);
    Timer.rset();
}

void bar(int checkInt, int x) {
    EXECx = x;
    EXECcheckInt = checkInt;
}

// with vect
foo(checkInt, vect, x);

// without vect
foo(0, 0);


0 commentaires