• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zrobić, by tablica była chroniona

Object Storage Arubacloud
0 głosów
247 wizyt
pytanie zadane 8 listopada 2018 w C i C++ przez periedynek Obywatel (1,320 p.)

Cześć. Mam pytanko. Czy istnieje jakaś szansa, by tablica board z klasy Board była chroniona?

class Board
{
protected:
    int board[16][16];
public:

    Board();
    void printBoard();
};
class GameEngine : protected Board
{
    public:
       virtual void apply(int,int,int,int,Board&)=0;
       int countPixels(int,int,int,int tab[16][16]);
};

class Effect0 : public GameEngine
{
public:
    void apply(int,int,int,int,Board&);
};

Wywala mi błąd tutaj:

void Effect0::apply(int x,int y,int dx,int dy,Board &board)
{
    int temp = y;
    for (; x <= dx; x++)
    {
        for (; y <= dy; y++)
        {
            board.board[x][y]=0; <<<<<<<<<
        }
        y = temp;
        board.board[x][y] = 0;
    }
}

Z errorem:

Czy muszę zrobić tę tablicę publiczną? Wtedy działa.

komentarz 8 listopada 2018 przez j23 Mędrzec (194,920 p.)

Jaki jest sens metody Effect0::apply, skoro operuje na zewnętrznym obiekcie? Logiczniej by było, gdyby operowała na tablicy this->board. Nie sądzisz?

komentarz 8 listopada 2018 przez periedynek Obywatel (1,320 p.)

Nie wiem szczerze powiedziawszy. Mam zrobić:

Napisz program, który definiuje zmodyfikowaną wersję gry w życie. Gdzie istnieje obiekt planszy, który posiada komórki w stanie 0 lub 1 i zestaw efektów, które sa nakładane na plansze. Efekty są nakładane za pomocą metody apply, która będzie częścią mechanizmu późnego wiązania. Program na wejściu będzie otrzymywał w kolejnych liniach 6 liczb na linię, gdzie pierwsze 4 (x, y, dx, dy) będą definiowały obszar na plaszy, na którą ma zostać nałożony efekt, piąta e liczba bedzie oznaczała kod efektu, a ostatnia dliczba numer planszy. Na wyjściu powinien pojawić się stan z ostatnio przetworzonej planszy.

Moj main wygląda tak:

int main()
{
    Effect0 effect0;
    Effect1 effect1;
    Effect2 effect2;
    Effect3 effect3;
    Effect4 effect4;
    //Effect5 ef_5;
   // Effect6 ef_6;
    GameEngine *effects[5]={&effect0,&effect1,&effect2,&effect3,&effect4};

    Board board[2];

    int x,y,dx,dy,effectNumber,boardNumber;
    while(cin>>x>>y>>dx>>dy>>effectNumber>>boardNumber ,!cin.eof())
    {
        if(x>=0 && x<16 && y>=0 && y<16 && dx>=x && dx<16 && dy>=y && dy<16 && effectNumber>=0 && effectNumber<=6 && boardNumber>=0 && boardNumber<=1)
        effects[effectNumber]->apply(x,y,dx,dy,board[boardNumber]);
    }
    board[boardNumber].printBoard();
}

Ja przesyłam tam numer plansze o podanym numerze, więc nie operuje na jednej planszy.

1 odpowiedź

+1 głos
odpowiedź 8 listopada 2018 przez j23 Mędrzec (194,920 p.)
edycja 9 listopada 2018 przez j23

Z opisu to raczej tak to powinno wyglądać:

board[boardNumber].apply(x, y, dx, dy, *effects[effectNumber]);

Efekty nakładasz na plansze, a nie plansze na efekty.


Linia 15: wywal !cin.eof() z warunku pętli.

komentarz 8 listopada 2018 przez periedynek Obywatel (1,320 p.)

Dodałem w takim razie metodę do klasy Board, którą stworzyłem.

Wygląda ona tak:

#ifndef BOARD_H
#define BOARD_H
#include "Effect.h"

class Board
{
public:
    int board[16][16];
    Board();
    void printBoard();
    void apply(int,int,int,int, Effect&);
};

#endif // BOARD_H
#include "Effect.h"
#include <iostream>

using namespace std;

Board::Board()
{
    ...
}

void Board::printBoard()
{
    ...
}

void Board::apply(int x, int y, int dx, int dy, Effect &effect){
    effect.apply(x,y,dx,dy,board);
}

Wywala mi niestety błędy takie:

23 linijka, to jest ta linijka z maina:

 board[boardNumber].apply(x, y, dx, dy, *effects[effectNumber]);

Nie wiem o co chodzi. Dodałem include z Effect, mimo to pisze ze nie jest zadeklarowana.

komentarz 8 listopada 2018 przez j23 Mędrzec (194,920 p.)
#include "Effect.h"
 
class Board { ... };

To nie ma prawa się skompilować. Klasa Effect dziedziczy po Board, a Ty próbujesz użyć  tej pierwszej przed deklaracją drugiej. Jakimś rozwiązaniem byłoby dodanie deklaracji zapowiadającej:

class Effect; // <--- zamiast #include "Effect.h"

class Board { ... };

ale jak już upubliczniłeś tablicę board, to nie ma potrzeby, by apply przyjmowała w parametrze referencję na obiekt klasy Effect, teraz możesz zostawić po staremu

komentarz 8 listopada 2018 przez periedynek Obywatel (1,320 p.)

W sensie jak zostawić po staremu? Nie rozumiem. Żadna klasa nie dziedziczy nic teraz, jedynie w klasie Efekt wygląda to tak: 

#ifndef GAMEENGINE_H
#define GAMEENGINE_H
#include "Board.h"

class Effect
{
public:
    virtual void apply(int,int,int,int,Board&)=0;
    int countPixels(int,int,int,int tab[16][16]);

};

class Effect0 : public Effect
{
public:
    virtual void apply(int,int,int,int,Board&);
};

class Effect1 : public Effect
{
public:
    virtual void apply(int,int,int,int,Board&);
};

class Effect2 : public Effect
{
public:
   virtual void apply(int,int,int,int,Board&);
};

class Effect3 : public Effect
{
public:
   virtual void apply(int,int,int,int,Board&);
};

class Effect4 : public Effect
{
public:
    virtual void apply(int,int,int,int,Board&);
};

#endif // GAMEENGINE_H

Mam usunąc referencję z apply w Board, wtedy jak będę wywoływać efekty tutaj?

void Board::apply(int x, int y, int dx, int dy, Effect &effect){
    effect.apply(x,y,dx,dy,board);
}

 

komentarz 8 listopada 2018 przez periedynek Obywatel (1,320 p.)

Dobra. Zrobiłem coś takiego w Effects

#ifndef EFFECT_H
#define EFFECT_H
class Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16])=0;
    int countPixels(int,int,int,int tab[16][16]);
};

class Effect0 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};

class Effect1 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};

class Effect2 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};

class Effect3 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};

class Effect4 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};
class Effect5 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};
class Effect6 : public Effect
{
public:
    virtual void apply(int,int,int,int,int [16][16]);
};

#endif // GAMEENGINE_H

Wywaliłem referencję do tablicy i zamieniłem na zwykłą tablicę.

Bo miałem w Effect #include <Board.h>, A w Board #include <Effect.h>. Co myślisz, dobrze to będzie wyglądać??

komentarz 9 listopada 2018 przez j23 Mędrzec (194,920 p.)

Referencja do Board była IMO lepsza.

Podobne pytania

0 głosów
1 odpowiedź 159 wizyt
pytanie zadane 23 stycznia 2016 w C i C++ przez Dash Nałogowiec (29,650 p.)
0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 19 czerwca 2021 w PHP przez Renzov Obywatel (1,220 p.)
0 głosów
2 odpowiedzi 121 wizyt
pytanie zadane 28 września 2020 w C i C++ przez Pelo Użytkownik (520 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...