• 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

0 głosów
121 wizyt
pytanie zadane 8 listopada 2018 w C i C++ przez periedynek Obywatel (1,110 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 Szeryf (89,260 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,110 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 Szeryf (89,260 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,110 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 Szeryf (89,260 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,110 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,110 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 Szeryf (89,260 p.)

Referencja do Board była IMO lepsza.

Podobne pytania

0 głosów
1 odpowiedź 93 wizyt
pytanie zadane 23 stycznia 2016 w C i C++ przez Dash Nałogowiec (29,550 p.)
0 głosów
2 odpowiedzi 110 wizyt
pytanie zadane 30 marca 2018 w Java przez neos Początkujący (320 p.)
0 głosów
0 odpowiedzi 64 wizyt
pytanie zadane 20 maja 2017 w JavaScript, jQuery, AJAX przez Sławek Obywatel (1,230 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

60,273 zapytań

105,971 odpowiedzi

220,187 komentarzy

32,477 pasjonatów

Przeglądających: 241
Pasjonatów: 16 Gości: 225

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...