klasy i metody w c++

0

Witam,
mam problem z zadaniem :
screenshot-20191227154306.png

chce zacząć wypełniać metody, ale wyskakuję dużo błędów, więc proszę o pomoc w naprawieniu metod.

class Set
{
char tab[];


public:
    Set (char tab[]);
    int size();
    bool contains(char znak) const;
    char insert(char znak);
    char remove(char znak);


};



char Set::insert (char znak)
{


}




char Set::remove (char znak)
{


}

char Set::size()
{
return sizeof(tab);
}
char Set::contains (char znak)

{

}





#include <iostream>


int main() {
Set set = Set().insert('a').insert('b').remove('b').remove('c');

std::cout << set.size() << std::endl << std::boolalpha;
std::cout << set.contains('a') << " " << set.contains('b') << " "  << set.contains('c') << " " << set.contains('d') << std::endl; }


błedy wyskakujące :
||=== Build file: "no target" in "no project" (compiler: unknown) ===|
:\10.2.11 Set.cpp|34|error: prototype for 'char Set::size()' does not match any in class 'Set'|
\KLASY\10.2.11 Set.cpp|9|error: candidate is: int Set::size()|
\KLASY\10.2.11 Set.cpp|38|error: prototype for 'char Set::contains(char)' does not match any in class 'Set'|
\\KLASY\10.2.11 Set.cpp|10|error: candidate is: bool Set::contains(char) const|
\10.2.11 Set.cpp||In function 'int main()':|
KLASY\10.2.11 Set.cpp|52|error: no matching function for call to 'Set::Set()'|
KLASY\10.2.11 Set.cpp|8|note: candidate: Set::Set(char*)|
\KLASY\10.2.11 Set.cpp|8|note: candidate expects 1 argument, 0 provided|
KLASY\10.2.11 Set.cpp|2|note: candidate: constexpr Set::Set(const Set&)|
KLASY\10.2.11 Set.cpp|2|note: candidate expects 1 argument, 0 provided|
\KLASY\10.2.11 Set.cpp|2|note: candidate: constexpr Set::Set(Set&&)|
KLASY\10.2.11 Set.cpp|2|note: candidate expects 1 argument, 0 provided|
||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

0

Czytaj te komunikaty z błędami

  • Masz w deklaracji klasy int size(); ale implementujesz char Set::size() { /* ... */ }
  • Wywołujesz Set() a nie masz konstruktora domyślnego
0
Spearhead napisał(a):

Czytaj te komunikaty z błędami

  • Masz w deklaracji klasy int size(); ale implementujesz char Set::size() { /* ... */ }
  • Wywołujesz Set() a nie masz konstruktora domyślnego

taki konstruktor zrobiłem

Set::Set(char tab[]):tab(){}

i poprawiłem metode size:

int Set::size()
{
return sizeof(tab);
}

mam problem z Setem jeszcze :
C:\KLASY\10.2.11 Set.cpp|52|error: no matching function for call to 'Set::Set()'|

cały kod:


class Set
{
char tab[];


public:
    Set (char tab[]);
    int size();
    bool contains(char znak) const;
    char insert(char znak);
    char remove(char znak);


};

Set::Set(char tab[]):tab(){}

char Set::insert (char znak)
{


}




char Set::remove (char znak)
{


}

int Set::size()
{
return sizeof(tab);
}
bool Set::contains(char znak) const

{

}





#include <iostream>


int main() {
Set set = Set().insert('a').insert('b').remove('b').remove('c');

std::cout << set.size() << std::endl << std::boolalpha;
std::cout << set.contains('a') << " " << set.contains('b') << " "  << set.contains('c') << " " << set.contains('d') << std::endl; }
0

No to ci pisałem, że nie masz konstruktora domyślnego. Ten

Set::Set(char tab[]):tab(){}

Nie jest domyślny, bo trzeba mu przekazać argument. A ty wywołujesz go bez niego.

0
Spearhead napisał(a):

No to ci pisałem, że nie masz konstruktora domyślnego. Ten

Set::Set(char tab[]):tab(){}

Nie jest domyślny, bo trzeba mu przekazać argument. A ty wywołujesz go bez niego.

Set::Set()
{
tab[]= ' ';
liczba=0;
znak = ' ';
}

o takie coś chodzi? Nie rozumiem za bardzo zamysłu
Set set = Set().insert('a').insert('b').remove('b').remove('c');

Czemu nazwa klasy jest tu funkcją która wywołuje metode. Jak to zaimplementować w kodzie

cały kod :

class Set
{
char tab[];
int liczba;
char znak;

public:
    Set();
    int size(int liczba);
    bool contains(char znak) const;
    char insert(char znak);
    char remove(char znak);


};

Set::Set()
{
tab[]= ' ';
liczba=0;
znak = ' ';
}

char Set::insert (char znak)
{


}




char Set::remove (char znak)
{


}

int Set::size(int liczba)
{
return sizeof(tab);
}
bool Set::contains(char znak) const

{

}





#include <iostream>


int main() {
Set set = Set().insert('a').insert('b').remove('b').remove('c');

std::cout << set.size() << std::endl << std::boolalpha;
std::cout << set.contains('a') << " " << set.contains('b') << " "  << set.contains('c') << " " << set.contains('d') << std::endl; }


1

Pozostaje Ci jedynie zaimplementować

class Set
{
public:
  Nowoutworzony zbiór jest pusty.
  Set();
  // Stała bezargumentowa metoda `size` zwracająca liczbę elementów zbioru
  int size() const;  
  // Stałą metodę `contains`, która przyjmuje znak i zwraca prawdę jeśli należy on do zbioru albo fałsz w przeciwnym razie
  bool contains(char znak) const;
  // Metodę `insert`, która przyjmuje znak, dodaje go do zbioru i zwraca referencję obiektu, na rzecz którego została wywołana
  Set& insert(char znak); 
  // Metodę remove, która przyjmuje znak, usuwa go ze zbioru i zwraca referencję obiektu, na rzecz którego została wywołana
  Set& remove(char znak); 

private:
  char* data;
  int length;
};
0

Nie mogę poradzić sobie z błędem :
C:\10.2.11 Set.cpp|46|error: assignment of member 'Set::length' in read-only object|
a dziwne, bo na takiej samej zasadzie przecież działa zmienna licz...

class Set
{
public:

  Set();
  // Stała bezargumentowa metoda `size` zwracająca liczbę elementów zbioru
  int size() const;
  // Stałą metodę `contains`, która przyjmuje znak i zwraca prawdę jeśli należy on do zbioru albo fałsz w przeciwnym razie
  bool contains(char znak) const;
  // Metodę `insert`, która przyjmuje znak, dodaje go do zbioru i zwraca referencję obiektu, na rzecz którego została wywołana
  Set& insert(char znak);
  // Metodę remove, która przyjmuje znak, usuwa go ze zbioru i zwraca referencję obiektu, na rzecz którego została wywołana
  Set& remove(char znak);

private:
  char data[];
  int length;
  int licz;
};

Set::Set(): licz(0), length(0){}


 Set& Set::insert (char znak)
{

data[licz]=znak;
licz++;

}




Set& Set::remove (char znak)
{

for (int i=0; i<=licz; i++)

    if (data[i]== znak) {data[i]=' '; licz--;}
}

int Set::size() const
{
 length = sizeof(data)/sizeof(int);


}
bool Set::contains(char znak) const

{
for (int i=0; i<=length; i++)
    {

      if (znak==data[i]) return 1;

      else return 0;

    }
}





#include <iostream>


int main() {
Set set = Set().insert('a').insert('b').remove('b').remove('c');

std::cout << set.size() << std::endl << std::boolalpha;
std::cout << set.contains('a') << " " << set.contains('b') << " "  << set.contains('c') << " " << set.contains('d') << std::endl; }
1

Wywal ten const qualifier int size() const;. Wewnątrz const member funkcji nie można modyfikować memberów.

1

@tajny_agent już Ci prawie wszystko napisał, więc ode mnie tylko uwaga:

Weź zeszycik i czerwonym długopisem napisz 10000 razy:

sizeof NIE SŁUŻY do sprawdzania rozmiaru tablicy !

0

udało mi się dziękuje za pomoc wszystkim tu obecnym

1 użytkowników online, w tym zalogowanych: 0, gości: 1