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

Funkcja tworząca obiekt

Object Storage Arubacloud
0 głosów
715 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 Ekspert (344,860 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,320 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 (194,920 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 Ekspert (344,860 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 (194,920 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ź 103 wizyt
pytanie zadane 5 grudnia 2021 w JavaScript przez TOWaD Mądrala (6,000 p.)
0 głosów
6 odpowiedzi 1,925 wizyt
0 głosów
2 odpowiedzi 213 wizyt

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...