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ę: class Circle { Point2D center; double radius; static int number_of_classes; static int number_of_classes_currently; static double Pi; public: Circle(); explicit Circle( double ); Circle( Point2D point ); Circle( Point2D point, double ); Circle( double, double, double ); Circle::Circle( Circle & circle ); ~Circle(); double circuit(); double area(); double radius_get(); int get_number_of_classes_Point2D_currently( Point2D & k ); int get_number_of_classes_Point2D( Point2D & k ); void WritePoint( Point2D & point ); void radius_set( double ); Point2D & ReadPoint(); static int func_number_of_classes_currently();
oraz definicja konstruktora z explicit Circle::Circle( double a ) { cout << "+++ Konstruktor jednoargumentowy Circle" << endl; center = Point2D( a ); }
w main mam taki kawałek kodu: 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 |
|
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. |
|
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. class Point2D { double x, y; static int number_of_classes_Point2D; static int number_of_classes_Point2D_currently; friend class Circle; public: Point2D(); explicit Point2D( double ); Point2D( double, double ); Point2D( const Point2D & Point ); ~Point2D(); double get_x(); double get_y(); void set_x( double ); void set_y( double ); };
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 ? |
|
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" |
|
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 ? |
|
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:
#include <iostream> using namespace std;
class complx { double re, im; public: complx() : re( 0 ) , im( 0 ) { } complx( const complx & c ) { re = c.re; im = c.im; } complx( double r, double i = 0.0 ) { re = r; im = i; } void display() { cout << "re = " << re << " im = " << im << endl; } };
int main() { complx one( 1 ); complx two = one; complx three = complx( 3, 4 ); complx four; complx five = 5; one.display(); two.display(); three.display(); four.display(); five.display(); }
|
|
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 ) ); |
|
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 :) |
|
« 1 » |