• 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
116 wizyt
pytanie zadane 8 listopada w C i C++ przez periedynek Użytkownik (860 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 przez j23 Szeryf (82,240 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 przez periedynek Użytkownik (860 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 przez j23 Szeryf (82,240 p.)
edycja 9 listopada 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 przez periedynek Użytkownik (860 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 przez j23 Szeryf (82,240 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 przez periedynek Użytkownik (860 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 przez periedynek Użytkownik (860 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 przez j23 Szeryf (82,240 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,530 p.)
0 głosów
2 odpowiedzi 100 wizyt
pytanie zadane 30 marca w Java przez neos Początkujący (320 p.)
0 głosów
0 odpowiedzi 63 wizyt
pytanie zadane 20 maja 2017 w JavaScript, jQuery, AJAX przez Sławek Obywatel (1,230 p.)
Porady nie od parady
Zadając pytanie postaraj się o odpowiedni tytuł, kategorię oraz tagi.Tagi

57,748 zapytań

102,788 odpowiedzi

212,076 komentarzy

29,694 pasjonatów

Przeglądających: 328
Pasjonatów: 14 Gości: 314

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.

...