webForumDet fria alternativet

Variabelinitialisering

6 svar · 471 visningar · startad av pettsson

pettssonMedlem sedan jan. 2002777 inlägg
#1

Jag skapar en klass och har då två privata strömmar, input och output, samt en open-funktion. I open() vill jag initiera input och output:

class MinKlass {
public:
 MinKlass();

private:
 void open();
 std::ifstream input;
 std::ofstream output;
};

MinKlass::MinKlass() {
 open();
}

// Fler funktioner

void MinKlass::open() {
 MinKlass::output = std::ifstream("filnamn");
 MinKlass::input = std::ofstream("filnamn");
}

Detta get dock något kryptiskt felmeddelande om privata metoder och operator= i std::basic_ios. Om jag däremot i klassen deklarerar filen direkt:

class MinKlass {
public:
 MinKlass();

private:
 void open();
 std::ifstream input("filnamn");
 std::ofstream output("filnamn");
};

Fungerar det. Dock så måste jag få lite data från programmet först, så det fungerar inte i praktiken. Varför fungerar det på det här sättet? Om jag i open() skriver

void MinKlass::open() {
 MinKlass::output("filnamn");
 MinKlass::input("filnamn");
}

Så får jag "term does not evaluate to a function taking 1 arguments". Vad gör jag fel?
Kör Visual C++ 2005 Express Edition om det hjälper.

PhorpherMedlem sedan feb. 20002 059 inlägg
#2

pettsson skrev:

Jag skapar en klass och har då två privata strömmar, input och output, samt en open-funktion. I open() vill jag initiera input och output:

class MinKlass {
public:
 MinKlass();

private:
 void open();
 std::ifstream input;
 std::ofstream output;
};

MinKlass::MinKlass() {
 open();
}

// Fler funktioner

void MinKlass::open() {
 MinKlass::output = std::ifstream("filnamn");
 MinKlass::input = std::ofstream("filnamn");
}

Detta get dock något kryptiskt felmeddelande om privata metoder och operator= i std::basic_ios. Om jag däremot i klassen deklarerar filen direkt:

class MinKlass {
public:
 MinKlass();

private:
 void open();
 std::ifstream input("filnamn");
 std::ofstream output("filnamn");
};

Fungerar det. Dock så måste jag få lite data från programmet först, så det fungerar inte i praktiken. Varför fungerar det på det här sättet? Om jag i open() skriver

void MinKlass::open() {
 MinKlass::output("filnamn");
 MinKlass::input("filnamn");
}

Så får jag "term does not evaluate to a function taking 1 arguments". Vad gör jag fel?
Kör Visual C++ 2005 Express Edition om det hjälper.

Nu var det ett bra tag sedan jag kodade C++ men nog är det väl så att med MinKlass::output("yaddayadda") så försöker du referera till en statisk klassvariabel.

Använd this istället.

pettssonMedlem sedan jan. 2002777 inlägg
#3

Hm, det är möjligt... Jag har sysslat med java tidigare, så jag vet inte riktigt. Men det blir samma fel i alla fall, "Term does not evaluate to a function taking 1 argument"

PhorpherMedlem sedan feb. 20002 059 inlägg
#4

pettsson skrev:

Hm, det är möjligt... Jag har sysslat med java tidigare, så jag vet inte riktigt. Men det blir samma fel i alla fall, "Term does not evaluate to a function taking 1 argument"

void MinKlass::open()
{
    this.output.open("filnamn");
    this.input.open("filnamn");
}
pettssonMedlem sedan jan. 2002777 inlägg
#5

Hum, det borde man kanske tänkt på... :r
Tack!

Sang-draxMedlem sedan juli 2002570 inlägg
#6

Du bör kanske göra så här istället:

MinKlass::MinKlass():
  input("filnamn"),
  output("filnamn")
{

}

och strunta i open()-funktionen eftersom den ändå anropas i konstruktorn.

pettssonMedlem sedan jan. 2002777 inlägg
#7

Ovanstående kod är förenklad, jag måste anropa några andra funktioner innan jag öppnar för skriv/läs. Annars hade det ju varit bättre.

Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb