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

C++ taka sama nazwa atrybutu co metody w klasie

Ostatnio zmodyfikowano 2018-01-02 16:14
Autor Wiadomość
155178
Temat założony przez niniejszego użytkownika
C++ taka sama nazwa atrybutu co metody w klasie
» 2017-12-31 02:46:15
Witam.

Posiadam w programie klasę DodatkoweWyposazenie, a jej kod wygląda tak :


DodatkoweWyposazenie.h :
C/C++
#pragma once
#include<string>
#include<iostream>

using namespace std;
class DodatkoweWyposazenie
{
protected:
    string nazwa;
public:
    void getnazwa();
    DodatkoweWyposazenie( string nazwa );
    ~DodatkoweWyposazenie();
    //DodatkoweWyposazenie(DodatkoweWyposazenie wyp);
};

DodatkoweWyposazenie.cpp :
C/C++
#include "DodatkoweWyposazenie.h"


DodatkoweWyposazenie::DodatkoweWyposazenie( string nazwa )
{
    this->nazwa = nazwa;
}


DodatkoweWyposazenie::~DodatkoweWyposazenie()
{
}

void DodatkoweWyposazenie::getnazwa()
{
    cout << endl << nazwa;
}

W taki sposób wszystko w programie działa, ale jeżeli chciałbym zamienić nazwę metody w pliku .h
void getnazwa();
 na
void nazwa();
 i analogicznie w pliku .cpp nazwę metody
C/C++
void DodatkoweWyposazenie::getnazwa()
{
    cout << endl << nazwa;
}
 na
C/C++
void DodatkoweWyposazenie::nazwa()
{
    cout << endl << nazwa;
}
 to kompilator wyrzuca mi błąd, że "identyfikator przesłonięcia jest niewłaściwy". W jaki sposób zmienić te nazwy? Robię zadanie zgodnie z diagramem UML i powinienem posiadać atrybut string nazwa oraz metodę void nazwa();, ale kompilator wyrzuca powyższy błąd.
P-168267
pekfos
» 2017-12-31 03:05:26
Nie da się w C++ mieć tej samej nazwy dla metody i pola w klasie. Z tych dwóch, prędzej pole będzie niewidoczne z zewnątrz, więc to jemu powinieneś nadać inną nazwę. Np m_nazwa, nazwa_, czy coś takiego.
P-168268
155178
Temat założony przez niniejszego użytkownika
» 2017-12-31 12:12:20
Czyli krótko mówiąc nie da się zrobić klasy w pełni zgodnej z diagramem UML?
https://imgur.com/9CuSNbV Tutaj podgląd schematu klasy. Po prostu rozwiązaniem jest zmiana nazwy atrybutu, aby się nie gryzła z nazwą metody, dobrze zrozumiałem?
P-168274
DejaVu
» 2017-12-31 14:11:42
Nie powinieneś mieć dwóch takich samych nazw, które mają inne znaczenie. W Twoim wypadku:
C/C++
auto v1 = obiekt.nazwa(); //OK, zapis jednoznaczny
auto v2 = obiekt.nazwa; //FAIL, zapis niejednoznaczny. Może być to nazwa zmiennej lub adres metody.
Jeżeli tworzysz nieprawidłowy diagram UML to nie oczekuj, że język programowania to zaakceptuje.
P-168278
155178
Temat założony przez niniejszego użytkownika
» 2017-12-31 14:28:20
Nie ja stworzyłem ten diagram UML. Dostałem za zadanie zaimplementować klasy według diagramu. Zadanie na uczelnię :) Dziękuję za rozwianie moich wątpliwości, dam po prostu inną nazwę metody.

A już korzystając z okazji mógłby mi ktoś pomóc z ułożeniem komentowanego klasyfikatora? Tzn. jak wyglądałaby postać konstruktora
DodatkoweWyposazenie( DodatkoweWyposazenie wyp );
 w pliku .cpp? To będzie coś typu przypisanie new DodatkoweWyposazenie = wyp? Nigdy nie budowałem takich konstruktorów na podstawie zmiennej typu klasa i nie wiem jak się za to zabrać.

Visual wyrzuca mi błąd przy samej deklaracji konstruktora 
DodatkoweWyposazenie( DodatkoweWyposazenie wyp );
 "niedozwolony konstruktor kopiujący : pierwszy parametr nie może być "DodatkoweWyposazenie". Czy da się w takim razie zadeklarować i utworzyć w jakiś sposób konstruktor zgodnie z otrzymanym diagramem UML? Chodzi o ostatnią linijkę na wrzuconym przeze mnie diagramie.

Z góry dziękuję.
P-168280
DejaVu
» 2017-12-31 14:41:15
C/C++
DodatkoweWyposazenie( const DodatkoweWyposazenie & wyp );
P-168282
155178
Temat założony przez niniejszego użytkownika
» 2017-12-31 14:44:30
Czyli przekazujemy oryginał klasy na której pracujemy, dobrze rozumiem? I czy bez const nie miałoby to racji bytu? Jak powinno to wyglądać w pliku .cpp? Przepraszam, że może głupie pytania zadaję, ale ciężko jest znaleźć informacje oparte na konkretnych pytaniach, samą ideę konstruktorów rozumiem, jedynie w tym przypadku nie jestem przekonany jak dokładnie to powinno wyglądać.

Najbardziej interesuje mnie co możemy zrobić ze stałą "wyp" w konstruktorze.
P-168284
YooSy
» 2017-12-31 15:56:13
To jest copy ctor więc jedno co powinno się zrobić w tym ctorze, to przepisać kropka kropkę zawartość wyp do *this. Nic ponad to, bo byłoby to zmienianie intencji tego ctora.

Stała referencja nie wymusza użycia copy ctora, jak w przypadku argumentu przez wartość, a const nie ogranicza przekazywanych argumentów do niestałych.
P-168288
« 1 » 2
  Strona 1 z 2 Następna strona