Java týden Java týden
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Diskuze: C++ volanie virtualnej metody s parametrom ostream &os

C a C++ C a C++ C++ volanie virtualnej metody s parametrom ostream &os American English version English version

Aktivity (1)
Avatar
michal.smatlak:1.12.2018 13:40

Zdravím, všetkých. Potrebujem poradiť. V mojom programe mám subor "Account.h" ktorý obsahuje len :

virtual void print(ostream &os) = 0
{

}

Ďalšie 3 triedy dedia

public Account

a metóda je v nich implementovaná napr. takto:

void Savings::print(ostream & os)
{
        os << "Savings" << endl;
}

neviem ale ako mám zavolať metódu "print" v main.cpp

Zkusil jsem: V main.cpp mám:

Account a2 = Savings();

a našiel som toto:

a2.print(cout);

ale mne to hádže errory: LNK2019 a LNK1120

Chci docílit: Poraďte mi, čo musím dať ako parameter pri volaní metódy print v main.cpp

Editováno 1.12.2018 13:41
 
Odpovědět 1.12.2018 13:40
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na michal.smatlak
patrik.valkovic:1.12.2018 13:57

Za prvé neimplementuj abstraktní metodu v hlavičkové třídě.

virtual void print(ostream &os) = 0;

Dále polymorfismus funguje pouze pro ukazatele a reference.

Saving s;
Account &a = s;
a.print();
Nahoru Odpovědět  +1 1.12.2018 13:57
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na patrik.valkovic
michal.smatlak:1.12.2018 14:36

Ale aký parameter mám dať do

a.print();

keď mám definované

virtual void print(ostream &os)

pretože bez parametra mi to samozrejme dá chybu.

 
Nahoru Odpovědět 1.12.2018 14:36
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na michal.smatlak
Martin Dráb:1.12.2018 22:54

Napiš sem plné znění těch chyb. Vypadá to ale na chyby linkeru, takže parametr (std::cout) tam asi není problematický. Obecně tam ale musíš dát něco, co je buď typu std::ostream, nebo má tuto třídu jako předka.

Ale jak říká Patrik, polymorfismus funguje pouze u objektů alokovaných na haldě (přes operátor new). U objektů alokovaných na zásobníku virtuální metody nefungují. Navíc, virtuální metody nemůžeš volat v rámci konstruktoru daného objektu.

Nahoru Odpovědět 1.12.2018 22:54
2 + 2 = 5 for extremely large values of 2
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na michal.smatlak
patrik.valkovic:2.12.2018 0:19

Tak tam ten parametr doplň, v čem je problém?

Jinak Martin Dráb, funguje to i u objektů alokovaných na zásobník, jde o to odkazovat na něj nepřímo (referencí či ukazatelem).

https://onlinegdb.com/HkxuBIqxJV

Nahoru Odpovědět 2.12.2018 0:19
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Martin Dráb
michal.smatlak:2.12.2018 11:59

Chyba LNK2001 Nerozpoznaný externí symbol "public: virtual void __cdecl Account::prin­t(class std::basic_os­tream<char,struct std::char_tra­its<char> > &)" ([email protected]­[email protected]@UEAAXAEAV?$ba­[email protected]?$char_­[email protected]@[email protected]@@st­[email protected]@@Z) Pokus C:\Users\michal\Des­ktop\VŠ\3. semester\INF3\Po­kus\Main.obj 1

 
Nahoru Odpovědět 2.12.2018 11:59
Avatar
Odpovídá na patrik.valkovic
michal.smatlak:2.12.2018 12:05

Account.h:

#pragma once
#include "I_Printable.h"

class Account : public I_Printable
{
public:
        virtual void print(ostream&) override;
};

Savings.h:

#pragma once
#include "Account.h"

class Savings : public Account
{
public:
        virtual void print(ostream& os) override;
};

Savings.cpp:

#include "Savings.h"

void Savings::print(ostream& os)
{
        os << "Savings" << endl;
}

Main.cpp:

#include <iostream>

#include "Account.h"
#include "Savings.h"

using namespace std;

int main() {
        Savings s;

        Account &a2 = s;

        a2.print(cout);

        return 0;
}
 
Nahoru Odpovědět 2.12.2018 12:05
Avatar
Odpovídá na michal.smatlak
michal.smatlak:2.12.2018 12:09

A ešte interface I_Printable.h:

#pragma once
#include <iostream>

using namespace std;

class I_Printable
{
public:
        virtual void print(ostream&) = 0;
};

viem že ten Account je zbytočný ale máme ho v zadaní

 
Nahoru Odpovědět 2.12.2018 12:09
Avatar
michal.smatlak:2.12.2018 12:10

Keď to spustím tak mi linker dá chybu ktorej znenie som písal vyššie.

 
Nahoru Odpovědět 2.12.2018 12:10
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na michal.smatlak
patrik.valkovic:2.12.2018 12:23

Nemáš implementovanou metodu Account::print. Buď ji udělej abstraktní nebo jí nadefinuj tělo.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 2.12.2018 12:23
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na patrik.valkovic
michal.smatlak:2.12.2018 16:05

Ďakujem, ja blbec som si to vôbec neuvedomil.

 
Nahoru Odpovědět 2.12.2018 16:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.