2016-11-21 11 views
-1

Итак, я столкнулся с некоторыми проблемами в C++ (моим первым языком программирования был C).C++-матрица классов (указатель указателей)

Скажем, у меня есть следующие классы:

2 заголовки (прямоугольник и сетки, предположит, что класс точки хорошо и другое предположение, что нам не нужны функции печати в настоящее время)

Grid. ч

#ifndef GRID_H 
#define GRID_H 
#ifndef RECT_H 
#include "Rectangle.h" 

#endif 

class Grid 
{ 
public: 
    Grid(int tileW, int tileH, int width, int height, int color); 
    ~Grid(); 
    Rectangle& getRectAt(const Point &p); 
    void print() const; 
private: 
    int count; 
    Rectangle **recs; 
}; 
#endif 

Rect.h

#ifndef RECT_H 
#define RECT_H 
#ifndef POINT_H 
#include "Point.h" 
#endif 

class Rectangle 
{ 
public: 
     Rectangle(int l, int u, int w, int h, int color); 
     int getColor() const; 
     void setColor(int color); 
     bool contains(const Point &p) const; 
     void print() const; 
private: 
     const Point topLeft, bottomRight; 
     int color; 
}; 

#endif 

и 2 каст-х:

Rect.cpp

#include "Rectangle.h" 

Rectangle::Rectangle(int l, int u, int w, int h, int color) : topLeft(l, u), bottomRight(l + w, u + h) { this->color = color; } 

int Rectangle::getColor() const 
{ 
    return this->color; 
} 

void Rectangle::setColor(int color) 
{ 
    this->color = color; 
} 

bool Rectangle::contains(const Point &p) const 
{ 
    return (this->topLeft.getX < p.getX && p.getX < this->bottomRight.getX 
     && this->bottomRight.getY < p.getY && p.getY < this->bottomRight.getY); 
} 

void Rectangle::print() const 
{ 
    /**/ 
} 

Grid.cpp

#include "Grid.h" 

Grid::Grid(int tileW, int tileH, int width, int height, int color) 
{ 
    int index, index_c=0; 
    recs = new Rectangle *[width]; 

    for (int index = 0; index < width; index++) 
    { 
     recs[index] = new Rectangle [height]; 
    } 

} 

(предположим, что нам не нужны другие функции и сетки конструктор не закончен).
Теперь, что я пытаюсь сделать, это в конструкторе Grid.cpp, я пытаюсь сделать динамически выделять массив массивов, но я просто не могу понять логику распределения памяти классов в cpp. Я был бы признателен, если бы кто-нибудь мог объяснить мне, как «новые» функции в cpp на классах и на n-мерных массивах (классов и вообще).

Надеюсь, вы поняли проблему, с которой я сталкиваюсь здесь.

Заранее спасибо.

+1

Не используйте необработанные указатели и 'new' /' delete' в C++. Вместо этого используйте контейнеры и интеллектуальные указатели. –

+0

Относительно: «Предполагается, что нам не нужны функции печати в настоящее время» Вместо того, чтобы делать предположения, удалите код и докажите, что это правда. Мало того, что вы будете удовлетворены тем, что будете правы, у вас будет меньшая площадь для поиска ошибок, и на один шаг ближе к [mcve], требуемому для этого вопроса, по теме. – user4581301

+0

Не совсем дубликат, но лучшее направление: [Инициализация двумерного std :: vector] (http://stackoverflow.com/questions/17663186/initializing-a-two-dimensional-stdvector) – user4581301

ответ

0
Grid::Grid(int tileW, int tileH, int width, int height, int color) // האם ניתן להניח את תקינות הקלט ? 
{ 
    int i ,j ; 
    i=0; 
    count=height*width; 
    recs=new Rectangle* [count]; 

    for(i=0;i<count;i++) 
    for(j=0;j<width;j++) 
    { 
     recs[i+j]=new Rectangle (tileW*j,tileH*i,tileW,1,tileH); 
    } 

} 

Вам нужно использовать 1 длинный массив и адресовать его как 2 мерный. Что касается qustion о новом взгляде на keren calif в CS13. NODELMAN - КОРОЛЬ !!!!

+0

Да, но если мы говорим о n-мерном массиве, вы не сможете отслеживать свою индексацию, поэтому я скорее найду решение о том, как разбить его на массив массивов, если есть, конечно. –

+0

Я не уверен, что это возможно без конструктора по умолчанию – benz