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

Funkcja tworząca obiekt

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,025 wizyt
pytanie zadane 13 maja 2020 w C i C++ przez Jakub Michalik Użytkownik (850 p.)

Witam, mam problem z utworzeniem funkcji odpowiedzialnej za pojawianie się nowych obiektów. Podpowiedział by ktoś jak mam to zrobić i w czym popełniam błąd. (W przyszłości chciałbym zrobić tak aby można było usuwać obiekt np za pomocą delete w funkcji main)

Oto co mam w kodzie:

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

using namespace std;


Klasa utworzObjekt()
{
	Klasa nowy;
	return nowy;
}

int main()
{
	cout << "Funkcja tworzaca klase" << endl;

	Klasa objekt = utworzObjekt();

	//cout << objekt.getLiczba << endl;

	return 0;
}

#NaukaProgramowaniaWDomu

komentarz 13 maja 2020 przez adrian17 Mentor (354,120 p.)

Ten kod wygląda dla mnie dobrze (choć nie pokazałeś pliku .h).

i w czym popełniam błąd

Więc nie wiem jaki błąd masz na myśli.

W przyszłości chciałbym zrobić tak aby można było usuwać obiekt np za pomocą delete w funkcji main

Ale nie trzeba, jeśli to jest zwykły obiekt na stosie. `delete`, tam gdzie jest potrzebne to nie jest "super że można", tylko "niestety trzeba" :P

komentarz 14 maja 2020 przez Oscar Nałogowiec (29,360 p.)

@Jakub Michalik,
 Aby taki kod dobrze działał musisz zdefiniować poprawny konstruktor kopiujący i operator przypisania dla twojej Klasy.

komentarz 14 maja 2020 przez j23 Mędrzec (195,240 p.)

Z tym "musisz" nie byłbym taki pewny. Bez definicji klasy lub treści błędu to może być równie dobrze brak średnika na końcu definicji klasy.

2 odpowiedzi

0 głosów
odpowiedź 13 maja 2020 przez Jacob99 Obywatel (1,840 p.)
wybrane 21 maja 2020 przez Jakub Michalik
 
Najlepsza

Żeby utworzyć obiekt musisz wywołać konstruktor, więc twoja funkcja powinna wyglądać tak:

Klasa utworzObiekt() {
    return Klasa();
}

PS. dobrym nawykiem jest używanie języka angielskiego w kodzie i (w przypadku C++) powszechną konwencją jest używanie snake_case'a do nazywania zmiennych i funkcji. Stosując się do tego, twój kod powinien wyglądać mniej więcej tak:

Klasa create_object() {
    return Klasa();
}

2. Jeśli koniecznie chcesz samodzielnie usuwać obiekt utworzony przez tę funkcję, to musisz zaalokować ten obiekt na stercie i operować na wskaźnikach, ale pamiętaj, że narażasz się na wiele błędów związanych z ręcznym zarządzaniem pamięcią np. wycieki pamięci albo podwójne zwolnienie pamięci.

Klasa* create_object() {
    return new Klasa();
}

int main() {
//...
auto obj = create_object();
//...
delete obj;
// Dobry nawyk, który wielokrotnie uratuje ci tyłek
// przy ręcznym zarządzaniu pamięcią
obj = nullptr;

return 0;
}

 

komentarz 14 maja 2020 przez adrian17 Mentor (354,120 p.)

Żeby utworzyć obiekt musisz wywołać konstruktor, więc twoja funkcja powinna wyglądać tak:

    return Klasa();

Nie, ten kod jest jak najbardziej poprawny.

    Klasa nowy;
    return nowy;

A co do

// Dobry nawyk, który wielokrotnie uratuje ci tyłek
// przy ręcznym zarządzaniu pamięcią
obj = nullptr;

jeszcze lepszym nawykiem jest testowanie programu z instrumentacją jak AddressSanitizer, zamiast polegać na "zerowaniu" martwych zmiennych ;)

komentarz 14 maja 2020 przez j23 Mędrzec (195,240 p.)
A najlepszym nawykiem jest używanie smart pointerów, wtedy nic nie trzeba zerować czy testować sanitizerami ;)
0 głosów
odpowiedź 13 maja 2020 przez Ajqs Obywatel (1,360 p.)
Rozumiem zamysł ale po co się w taki sposób tym bawić? Nie lepiej tworzyć obiekt tak jak przystało? Rozpisz co chciałbyś tym osiągnąć to może zrozumiem jaki jest twój zamysł.

Podobne pytania

0 głosów
1 odpowiedź 143 wizyt
pytanie zadane 5 grudnia 2021 w JavaScript przez TOWaD Mądrala (6,480 p.)
0 głosów
6 odpowiedzi 2,190 wizyt
0 głosów
2 odpowiedzi 340 wizyt

93,434 zapytań

142,429 odpowiedzi

322,661 komentarzy

62,797 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

...