Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Explicit

Ostatnio zmodyfikowano 2014-04-13 11:06
Autor Wiadomość
ArgonZapan
Temat założony przez niniejszego użytkownika
[C++] Explicit
» 2014-03-31 00:57:12
Nie wiem co o tym myśleć, mam taką klasę:

C/C++
class Circle {
    Point2D center; // współrzędne środka koła
    double radius; // promień
    static int number_of_classes; // licznik class
    static int number_of_classes_currently; // licznik istniejących klas
    static double Pi; // Zmienna Pi
   
public:
    Circle(); // Konstruktow domyślny zwiększający licznik obiektów
    explicit Circle( double );
    Circle( Point2D point );
    Circle( Point2D point, double );
    Circle( double, double, double );
    Circle::Circle( Circle & circle );
    ~Circle(); // Destruktor zmniejszający licznik obiektów
   
    double circuit(); // zwraca Obwód
    double area(); // zwraca Powierzchnie
    double radius_get(); // Zwraca długość promienia
   
    int get_number_of_classes_Point2D_currently( Point2D & k ); // Zwraca aktualną liczbę obiektów Point2D
    int get_number_of_classes_Point2D( Point2D & k ); // Zwraca liczbę powstałych obiektów Point2D
   
    void WritePoint( Point2D & point ); // Zapisuje punkt x, y
    void radius_set( double ); // Ustawienie długości promienia
   
    Point2D & ReadPoint(); // Zwraca klasę Point2D, o nazwie Center
   
    static int func_number_of_classes_currently(); // Funkcja zwracająca liczbę istniejących obiektów

oraz definicja konstruktora z explicit

C/C++
Circle::Circle( double a ) {
    cout << "+++ Konstruktor jednoargumentowy Circle" << endl;
    center = Point2D( a );
}

w main mam taki kawałek kodu:
C/C++
cout << "Przyklad 8.) Circle coral = 2;" << endl;
Circle coral = 2;
cout << endl;

Oczywiście cały kod jest mój i teraz nie wiem czy ostatnie zadanie jest podchwytliwe czy coś źle zrobiłem, a brzmi ono:
Przed konstruktorem Circle(double) dodaj przydomek explicit. Jak zmieniły się wyniki w Przykładzie 8.)? Usuń dodany przydomek.

problem w tym że się nie zmieniają.

Co do tego konstruktora miałem takie polecenie
Stwórz konstruktor jednoargumentowy (argument typu double, ma jawnie wywoływać odpowiadający mu konstruktor z klasy Point2D)

explicit z tego co wyczytałem ma zapobiegać niejawnemu wywołaniu konstruktora, czy odpowiedź do tego zadania będzie brzmiała:
Nic się nie zmienia bo wszystko jest jawnie zrobione ???

Czy może coś źle zrobiłem ?

Edit:
Zapomniałbym, wynikami są jakie konstruktory/destruktory się uruchomiły
P-107506
Monika90
» 2014-03-31 12:09:40
Ten kod jest nieprawidłowy, bez względu na to, czy konstruktor ma atrybut explicit czy nie.

Po pierwsze
Circle::Circle( Circle & circle );

Kwalifikator Circle:: użyty w deklaracji funkcji wewnątrz klasy, to jest błąd składniowy.

Po drugie
Circle coral = 2;

To jest inicjalizacja r-wartością przy użyciu konstruktora kopiującego. Wymaga to konstruktora kopiujacego, którego argumentem jest referencja do const:
Circle( const Circle & circle );
 - u ciebie nie ma const.

Z tego wynika, że używasz kompilatora Microsoftu.

PS.
Pokaż jak wygląda definicja Point2D.
P-107512
ArgonZapan
Temat założony przez niniejszego użytkownika
» 2014-03-31 13:54:22
wrzucam kod, przeanalizuję to co napisałaś, jak wrócę z fizyki. Tak programuje w VS2013, a nawet mamy taki lekki wymóg bo na laboratoriach mamy tylko to oprogramowanie, a sprawdzane jest też w VS.

C/C++
class Point2D {
    double x, y; // Współrzędne x i y
    static int number_of_classes_Point2D; // ilosc obiektow od początku programu
    static int number_of_classes_Point2D_currently; // aktualna ilosc obiektow
    friend class Circle;
public:
    Point2D(); // Konstruktor domniemany, zwieksza licznik obiektów
    explicit Point2D( double );
    Point2D( double, double ); // konstruktor dwuargumentowy przypisujacy poczatkowe wartosci x i y
    Point2D( const Point2D & Point ); // konstruktor kopiujący
    ~Point2D(); // destruktor
    double get_x(); // zwraca x
    double get_y(); // zwraca y
    void set_x( double ); // zmienia x = a
    void set_y( double ); // zmienia y = a
};

Edit:

Co do pierwszego to wiem, jakoś mi się tam zawieruszył i nie zauważyłem.
Co do drugiego,
Czy zawsze musi być to const ? Z tego co pamiętam na wykładzie, mówiono mi że bez const też da się, tylko że istnieje wtedy możliwość zmiany jakiegoś składnika w obiekcie z którego kopiujemy.

Dałem const w obydwóch klasach, teraz mam problem jak odnieść się do tej 2 w main'ie ?
P-107515
Monika90
» 2014-03-31 23:33:18
Czy zawsze musi być to const ? Z tego co pamiętam na wykładzie, mówiono mi że bez const też da się, tylko że istnieje wtedy możliwość zmiany jakiegoś składnika w obiekcie z którego kopiujemy.
Nie musi, ale powinno być. Jak nie ma const, to nie da się skopiować stałych, ani obiektów tymczasowych (np. wartości zwracanych z funkcji). Jeżeli chcesz zmodyfikować obiekt, z którego kopiujesz, to do tego służą referencje do r-wartości i konstruktory przenoszące.


Dałem const w obydwóch klasach, teraz mam problem jak odnieść się do tej 2 w main'ie ?
Nie rozumiem, co masz na myśli.

i zmień "circuit" na "circumference"
P-107545
ArgonZapan
Temat założony przez niniejszego użytkownika
» 2014-04-01 10:46:09
Circle coral = 2;

Tworzę obiekt coral do którego mam przypisać 2, jak się odnieść do tej 2 ?
P-107555
alixir
» 2014-04-01 11:50:53
Coś mieszasz. Próbujesz wywołać niejawnie konstruktor
Circle coral = 2;
, co na bank musi zakończyć się błędem, jeśli konstruktor jest oznaczony jako explicit.

Tu masz ładny przykład:

C/C++
// This example illustrates explicit initialization
// by constructor.
#include <iostream>
using namespace std;

class complx {
    double re, im;
public:
   
    // default constructor
    complx()
        : re( 0 )
        , im( 0 )
    { }
   
    // copy constructor
    complx( const complx & c ) { re = c.re; im = c.im; }
   
    // constructor with default trailing argument
    /*explicit*/ complx( double r, double i = 0.0 ) { re = r; im = i; }
   
    void display() {
        cout << "re = " << re << " im = " << im << endl;
    }
};

int main() {
   
    // initialize with complx(double, double)
    complx one( 1 );
   
    // initialize with a copy of one
    // using complx::complx(const complx&)
    complx two = one;
   
    // construct complx(3,4)
    // directly into three
    complx three = complx( 3, 4 );
   
    // initialize with default constructor
    complx four;
   
    // complx(double, double) and construct
    // directly into five
    complx five = 5;
   
    one.display();
    two.display();
    three.display();
    four.display();
    five.display();
}
P-107556
Adik80
» 2014-04-01 11:55:42
A mi sie wydawalo ze zapis
Circle coral = 2;
 jest rownowazny zapisowi
Circle coral( 2 );
, czyli jest wywolywany konstruktor konwertujacy a nie kopiujacy. Dodanie explicit powinno spowodowac blad ze nie mozna skonwertowac int do Circle. Bez explicit niejawnie konwertuje 
Circle coral( double( 2 ) );

P-107557
ArgonZapan
Temat założony przez niniejszego użytkownika
» 2014-04-13 11:06:32
Dzięki wszystkim za odpowiedzi, zrozumiałem w końcu o co chodzi z tym explicit :)
P-108099
« 1 »
  Strona 1 z 1