Oppure

Loading
14/05/17 21:02
AldoBaldo
Dunque, un'altra inaccuratezza da parte di chi ha scritto la consegna! Italiano, questo sconosciuto.

Non essendoci un metodo dec(), direi che l'unico modo in cui una funzione "esterna" alla classe potrebbe modificarne una proprietà privata sia farne una funzione "friend"...
Ultima modifica effettuata da AldoBaldo 14/05/17 21:13
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
14/05/17 21:06
Sicuramente non è spiegato affatto bene ... e quindi potrebbe anche voler dire altro ... attenderemo lumi ...
14/05/17 21:32
AldoBaldo
A livello di pura ipotesi... siccome intende diminuire un oggetto counter e non diminuire un contatore, e dato che un oggetto counter viene inizializzato (come da consegna) a zero ed ha solo un metodo per incrementarlo, non è possibile avere oggetti counter con valore minore di zero (giusto?).

Inoltre, e mi contraddico, non è necessario modificare direttamente la proprietà val, visto che si vuole che la funzione "esterna" produca un nuovo oggetto e non un puntatore o un reference all'oggetto ricevuto come parametro.

Date queste due premesse, io risolverei in un modo di questo genere...

// (codice rimosso)


Edit: anzi, no, che poi mi sgridate!
Ultima modifica effettuata da AldoBaldo 14/05/17 21:34
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
15/05/17 9:40
Djot
Ragazzi , purtroppo ciò che ho scritto era proprio la consegna dell'esercizio , nemmeno io riesco a capire cosa voglia di preciso , penso che si debba definire una funzione (esterna alla classe) che agisce direttamente su un oggetto Counter , ma non capisco come procedere.
aaa
15/05/17 9:52
Hai già avuto chiuso un thread per la richiesta di soluzione di un esercizio.

Se non proponi qualcosa di tuo, non si può fare l'esercizio al posto tuo ...
15/05/17 10:03
Djot
L'idea era di considerare val come un valore public , il codice da me scritto è questo :
#include <iostream>
using namespace std;

class Counter{
public:
    int val;
    Counter(){
    val = 0;
    }
    void Inc(){
    val++;
    }
    int Read(){
    return val;
    }
};
int Function(Counter c1){
if(c1.val > 0)
    return (c1.val-1);
    else if(c1.val == 0)
        return 0;
}


Ma non mi convince assolutamente
aaa
15/05/17 12:42
No, non mi sembra corretto.

Anche perché, per quello che si capisce, devi restituire un nuovo oggetto Counter a partire dal primo
15/05/17 12:51
AldoBaldo
Rendendo val una proprietà comune degli oggetti di classe Counter non avresti più la garanzia che val sia sempre e comunque >= 0, dunque direi che è una soluzione impraticabile, in contrasto con le richieste della consegna.

Nessuno ti impedisce invece di rilevare in Function() il valore di val tramite c1.Read(), quindi lavorare sulla copia di val appena letta.

Considera inoltre che la consegna ti chiede di fare in modo che la funzione esterna alla classe dato un contatore [...] ne restituisca un altro. Il che significa che Function() non deve restituire int, bensì un oggetto di classe Counter che non sia quello passato come parametro. Ovviamente si tratterebbe di un oggetto temporaneo, ma questo pare non importare. In altre parole...

Counter Function( const Counter &c1 ) {
    Counter contatore; // oggetto da restituire
    int valore = c1.Read();

    // si fa quel che si deve fare sul valore di c1 e sull'oggetto da restituire

    return contatore; // si restituisce una copia dell'oggetto temporaneo di classe Counter
}


Nota che ho usato un reference come parametro, ma non è indispensabile.
Per potere usare un reference costante, occorre che Read() sia dichiarata così:

int Read() const { return val; }


P.S. Non è la soluzione, sono solo indizi (spero utili, spero corretti).
Ultima modifica effettuata da AldoBaldo 15/05/17 12:54
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.