• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wywołanie w metodzie klasy nr 1 metody z klasy nr 2.

VPS Starter Arubacloud
0 głosów
401 wizyt
pytanie zadane 16 czerwca 2015 w C i C++ przez tarnasm Gaduła (3,030 p.)
Witajcie.

Podpowiedzcie mi proszę w jaki sposob wywołać metode będąca voidem z klasy nr2 w klasie nr 1 ale równiez w voidzie.

Pozdrawiam.

3 odpowiedzi

0 głosów
odpowiedź 16 czerwca 2015 przez Dorion300 Szeryf (90,250 p.)
Można zaprzyjaźnić klasy albo udostępnić publicznie.
komentarz 16 czerwca 2015 przez tarnasm Gaduła (3,030 p.)

To wiem. Chodzi mi już o sam kod. Ja robie to tak:

void Klasa1::Metoda()
{
case '1': Klasa2::Metoda(); break;
}

i kompilator zgłasza błąd.

 

komentarz 16 czerwca 2015 przez Radfler VIP (101,030 p.)
Co? Case w środku funkcji? To Twój kod czy tylko przykład?
komentarz 16 czerwca 2015 przez tarnasm Gaduła (3,030 p.)
To mój. Switch w funkcji to zakazana opcja?
komentarz 16 czerwca 2015 przez Radfler VIP (101,030 p.)

Nie, nie tylko jak dla mnie to powinno wyglądać tak:

void Klasa1::Metoda() {
    switch(/*jakaś zmienna*/) {
        case '1': Klasa2::Metoda(); break;
    }
}

Sam case bez switcha nie istnieje ;)

komentarz 16 czerwca 2015 przez Dorion300 Szeryf (90,250 p.)
1. metoda musi być statyczna. W przykładzie nie ma żadnego switch'a
komentarz 16 czerwca 2015 przez tarnasm Gaduła (3,030 p.)
A to się nie zrozumielismy:D Istnienie switcha pominąłem w tym przykladowym kodzie celowo. Ale wielkie dzięki za czujność :)
0 głosów
odpowiedź 16 czerwca 2015 przez Radfler VIP (101,030 p.)

Metoda() w Klasa2 musi być statyczna! Jeżeli nie jest to musisz utworzyć obiekt tej klasy i wywołać tą funkcję na rzecz tego obiektu:

Klasa2 obiekt;
obiekt.Metoda();
0 głosów
odpowiedź 5 listopada 2015 przez s92 Bywalec (2,300 p.)
Sorki że odgrzewam kotleta, ale mam pytanie czy można w metodzie z Klasy2 przesłać jako argument metody obiekt Klasy1 ?
komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
Można. Spróbuj.
komentarz 5 listopada 2015 przez s92 Bywalec (2,300 p.)

Naskrobałem mniej więcej coś takiego, ale wywalało mi błąd.

void Klasa1::Metoda1(const Klasa& k)
{
	Klasa2::Metoda2(k)
}

void Klasa1::Metoda2(const Klasa& k)
{
	cout << k1.zmienna;
}

 

komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)

A jaki błąd CI wywala ?

---

#include <iostream>

using namespace std;

class DrugaKlasa
{
    public:
    int zmienna;

    DrugaKlasa()
    {
        zmienna = 42;
    }
};


class PierwszaKlasa
{
    public:
    void Metoda(DrugaKlasa& klasa) 
    {
        cout << klasa.zmienna << endl;
        klasa.zmienna = 997;
    }
};

int main()
{
    PierwszaKlasa pierwsza = PierwszaKlasa();
    DrugaKlasa druga = DrugaKlasa();
    
    pierwsza.Metoda(druga);

    cout << druga.zmienna << endl;
    
    return 0;
}

 

komentarz 5 listopada 2015 przez s92 Bywalec (2,300 p.)

Porozbijałem to na takie pliki:

main.cpp

#include <iostream>
#include <conio.h>
#include "klasa1.h"
#include "klasa2.h"

using namespace std;

int main()
{
	PierwszaKlasa pierwsza = PierwszaKlasa();
	DrugaKlasa druga = DrugaKlasa();

	pierwsza.Metoda(druga);

	return 0;
}

klasa1.cpp

#include <iostream>
#include "klasa1.h"

using namespace std;

class DrugaKlasa;

class PierwszaKlasa
{
public:
	void PierwszaKlasa::Metoda(const DrugaKlasa& klasa) 
	{
		cout << klasa.zmienna;
	}
};

klasa1.h

#include <iostream>

using namespace std;

class DrugaKlasa;

class PierwszaKlasa
{
public:
	void Metoda(const DrugaKlasa& klasa);
};

klasa2.h

#include <iostream>

using namespace std; 

class DrugaKlasa
{
public:
	int zmienna;

	DrugaKlasa()
	{
		zmienna = 42;
	}
};

I podkreśla mi w pliki klasa.cpp "klasa.zmienna"

komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
A kompiluje ? Podaje jakiś komunikat o błedzie podczas kompilacji ?

---

Pierwsza klasa korzysta z drugiej klasy więc warto zainkludowac nagłowek drugiej klasy aby pierwsza klasa znała wszystkie pola i metody drugiej klasy.
komentarz 5 listopada 2015 przez s92 Bywalec (2,300 p.)

Nie kompiluje. Przy podkreśleniu wyrzuca błąd 

incomplete type is not allowed 

Dodałem nagłówek tak jak mówiłeś, ale pojawiają się inne błędy. Ten powyżej zniknął. 

teraz jest: " 'PierwszaKlasa': 'class' type redefinition" 

komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)

No to co pisałem - trzeba zaincludowac cały nagłówek drugiej klasy zamiast dawać linię `class DrugaKlasa;`

komentarz 5 listopada 2015 przez s92 Bywalec (2,300 p.)

To zaś inny błąd wywala. 

missing type specifier - int assumed. Note: C++ does not support default-int

komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
Ale jakiego kodu (której linijki) to się dotyczy ?
komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
#include <iostream>
#include "klasa1.h"
#include "klasa2.h"

using namespace std;

int main()
{
    PierwszaKlasa pierwsza = PierwszaKlasa();
    DrugaKlasa druga = DrugaKlasa();

    pierwsza.Metoda(druga);

    return 0;
}

klasa1.h

#include "klasa2.h"

#ifndef KLASA1_H
#define KLASA1_H

class PierwszaKlasa
{
public:
    void Metoda(const DrugaKlasa&);
};

#endif

klasa1.cpp

#include <iostream>
#include "klasa1.h"

using namespace std;

void PierwszaKlasa::Metoda(const DrugaKlasa& klasa)
{
    cout << klasa.zmienna;
}

klasa2.h

#ifndef KLASA2_H
#define KLASA2_H

class DrugaKlasa
{
public:
    int zmienna;

    DrugaKlasa();
};

#endif

klasa2.cpp

#include "klasa2.h"

DrugaKlasa::DrugaKlasa()
{
    zmienna = 42;
}

 

komentarz 5 listopada 2015 przez s92 Bywalec (2,300 p.)

Teraz działa. Możesz mi powiedzieć po co są te:

#ifndef 

#define 

komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
W programie kilka razy muszę includować ten sam plik - jeśli nie dam tych linii preprocesora to będzie ten sam kod dodawało kilka razy i kompilator stwierdzi, że mam dwie klasy/funkcje/zmienne o takiej samej nazwię - więc jest coś nie tak.
komentarz 5 listopada 2015 przez s92 Bywalec (2,300 p.)
A Ok! Dzięki wielkie za pomoc!

Podobne pytania

0 głosów
1 odpowiedź 648 wizyt
pytanie zadane 24 lipca 2018 w C i C++ przez Krutek Początkujący (330 p.)
0 głosów
4 odpowiedzi 383 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez Adrian Stasiak Początkujący (410 p.)
0 głosów
1 odpowiedź 106 wizyt
pytanie zadane 26 grudnia 2016 w C i C++ przez PryPry Nowicjusz (160 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...