Gå til innhold

Må man oppgi alle variablene til en funksjon?


Anbefalte innlegg

Hei, er en stund sia jeg har drevet med c++ nå, har hovedsaklig holdt på med python i det siste... Men skal ikke dette gå ann?

 

void MainWindow::on_cancelSaveButton_clicked()
{
   setVisibleAreas(sba = true, fla = true);
}

void MainWindow::setVisibleAreas(bool sba = false, bool fla = false, bool pia = false,
                                bool va = false, bool voa = false, bool asa = false)
{
   ui->serverButtonsArea->setVisible(sba);
   ui->fileListArea->setVisible(fla);
   ui->pathIndicatorArea->setVisible(pia);
   ui->videoArea->setVisible(va);
   ui->videoOptionsArea->setVisible(voa);
   ui->addServerArea->setVisible(asa);
}

 

Feilen jeg nå får ved kompilering er at variablene sba og fla ikke finnes...

Lenke til kommentar
Videoannonse
Annonse

(...) har hovedsaklig holdt på med python i det siste...

 

Det synes :)

 

Men skal ikke dette gå ann?

 

Nei, det du ønsker (uten tvil inspirert av Python sin håndtering av rest/keyword arguments) er umulig i C++. Uttrykket for hver formell parameter evalueres i konteksten av kallstedet; i eksempelet ditt er sba/fla ikke definert i den. Meningen i C++ er å droppe *resterende* argumenter (heller enn å ha skikkelig keyword argument støtte (i Python sin forstand av begrepet)):

 

[ sitat 8.3.6 §1 ]

(...) Default arguments will be used in calls where trailing arguments are missing.

[ /sitat ]

  • Liker 1
Lenke til kommentar

Ja ok... digga denne funksjonen med Python... når sant skal sies digger jeg det meste med python, utenom hastigheten :p

 

Takk for svar anywho!

 

Prøv dette.

 

void MainWindow::on_cancelSaveButton_clicked()
{
   setVisibleAreas(true, true);
}

void MainWindow::setVisibleAreas(bool sba = false, bool fla = false, bool pia = false,
                                bool va = false, bool voa = false, bool asa = false)
{
   ui->serverButtonsArea->setVisible(sba);
   ui->fileListArea->setVisible(fla);
   ui->pathIndicatorArea->setVisible(pia);
   ui->videoArea->setVisible(va);
   ui->videoOptionsArea->setVisible(voa);
   ui->addServerArea->setVisible(asa);
}

Lenke til kommentar
  • 2 uker senere...

Dersom du ikke har nok variabler til å sende til en funksjon, så kan du bruke NULL, tror jeg, som for eksempel her:

 

#include <iostream>
using namespace std;

void sayInfo(String Name, int age){
cout<<Name << " is " << age << " years old"<<endl;
}

int main(){
sayInfo("John", NULL);
return 0;
}

 

Koden over skulle gi deg denne outputen ( med mindre jeg gjorde noe feilm men antar at du forstår pointet):

 

John is years old

Lenke til kommentar

Nei, det kan du ikke. NULL er en 0-peker konstant, definert til ((void*)0), og har ingenting med dette eksempelet å gjøre. C++ kan defaulte argumenter (hvis de kommer sist) vel og merke.

 

void sayInfo(const std::string& name, int age = 0)
{
  std::cout << name << " is " << age << " years old." << std::endl;
}

 

Her blir age printet ut dog, selv om vi kaller på sayInfo("foo");. Age blir fylt inn automatisk. Hvis man vil unngå at det skal være noe snakk om age i det hele tatt kan man overloade sayInfo til å ha to forskjellige prototyper.

 

void sayInfo(const std::string& name);
void sayInfo(const std::string& name, int age);

Endret av TheMaister
Lenke til kommentar
  • 2 uker senere...

I C++ er det en name-mangling som også impliserer argumentene til en funksjon(kan finnes ved å kjøre nm mot en .so i linux). Hvis du vil ta en tur ut i det litt mer obskøne derimot, så har ikke C denne name-manglingen, du kan dermed kalle ferdigkompilerte funksjoner med hvilke argument du vil(hvis du utelater headerfila, du får en del warnings under kompilasjon)...

 

Det er på grunn av dette at det er normalt å publisere headerfiler sammen med kompilerte bibliotek når du skal utvikle...

Lenke til kommentar

(...) så har ikke C denne name-manglingen, du kan dermed kalle ferdigkompilerte funksjoner med hvilke argument du vil(hvis du utelater headerfila, du får en del warnings under kompilasjon)...

 

Mmm, nei, det kan du ikke (6.5.2.2, p 6 er veldig eksplisitt på det).

 

Har du prøvd? Funker fint på min versjon av CC. Men jeg sa vel ikke noe om at det er ekstremt dumt, da det ikke er støtte for det, så vil jo programmet nesten alltid krasje...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...