2010-09-26 8 views
1

hi im пытается передать некоторые значения классу, но он не позволит мне это сказать недействительное использование класса 'Figure' im, пытающегося отправить 3 значения x, y, z, и все это, но это не позволит мне понять, что я пытаюсь делать ...Недопустимое использование класса в C++?

вот main.cpp и функция, которая вызывает классовую Рисунок

for (j = 0; j < num_elems; j++) { 
    /* grab and element from the file */ 
    vlist[j] = (Vertex *) malloc (sizeof (Vertex)); 
    ply_get_element (ply, (void *) vlist[j]); 


    int vert=sprintf(szFile,"vertex: %g %g %g", vlist[j]->x, vlist[j]->y, vlist[j]->z); 
    /* print out vertex x,y,z for debugging */ 
    TextOut(hDC,600,j*20,szFile,vert); 
    DrawFig->Figure(vlist[j]->x, vlist[j]->y, vlist[j]->z); 
    } 

ошибка здесь,

DrawFig->Figure(vlist[j]->x, vlist[j]->y, vlist[j]->z); 
    } 

Вот WM_CREATE: где я инициализировать все

case WM_CREATE: 
     hDC = GetDC(hWnd); 
    //ShowWindow(g_hwndDlg,SW_SHOW); 
    hRC=wglCreateContext(hDC); 
    wglMakeCurrent(hDC,hRC); 
    g_hwndDlg = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,DialogProc); 

    DrawFig= new Figure(1.0,1.0,1.0); 
    initGL(); 
    break; 

вот Figure.h

class Figure 
{ 
    public: 
     Figure(float x,float y,float z); 
     void Draw(); 
     float paramx(){ 
     return x1; 
     } 
     float paramy(){ 
     return y1; 
     } 
     float paramz(){ 
     return z1; 
     } 
    protected: 
    private: 
    float x1,y1,z1; 
    list <Figure> m_vertices; 
}; 

и здесь является Figure.cpp

Figure::Figure(float x,float y,float z){ 
    this->x1=x; 
this->y1=y; 
this->z1=z; 
m_vertices.push_back(Figure(x1, y1, z1)); 
} 

void Figure::Draw() 
{ 
    list<Figure>::iterator p = m_vertices.begin(); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glLoadIdentity(); 
    gluLookAt(0.0,0.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0); 

    glColor3f(0.7f,1.0f,0.3f); 
    glBegin(GL_LINE_LOOP); 
    while(p != m_vertices.end()){ 
     glNormal3f(p->paramx(),p->paramy(),p->paramz()); 
     glVertex3f(p->paramx(),p->paramy(),p->paramz()); 
     p++; 
    } 
    glEnd(); 
} 

какие-либо идеи? это opengl, C++ и im с использованием кодовых блоков 10.05 на всякий случай ну да им инициализировать его на main.h вот так DrawFig * Figure;

ответ

3

@ Ответ на dark_charlie почти правильный. Вот лучший вариант, который действительно будет работать, но все же, вероятно, не то, что вы хотите:

class Figure { 
    // ... 
public: 
    void set(float x, float y, float z); 
    // ... 
}; 

void Figure::set(float x, float y, float z) 
{ 
    // Your original code from the constructor 
    this->x1 = x; 
    this->y1 = y; 
    this->z1 = z; 
} 

Figure::Figure(float x, float y, float z) 
{ 
    // In the constructor call the newly created set function 
    set(x, y, z); 
    m_vertices.push_back(Figure(x1, y1, z1)); 
} 


// Replace the faulty line with this: 
DrawFig->set(vlist[j]->x, vlist[j]->y, vlist[j]->z); 

Теперь, это почти наверняка не то, что вы хотите. Но также очень сложно понять, чего вы хотите. У вас проблемы с дизайном. Проблема дизайна заключается в том, что Figure несет две обязанности. Это как точка в пространстве, так и множество точек, описывающих фигуру. Эта путаница обязанностей ведет к тому, что ваш класс не сможет на самом деле заполнить любой из них.

Вам нужны два класса. Вам нужен класс Point и класс Figure. Класс Figure должен позволять вам устанавливать местоположение фигуры, а также позволять добавлять точки к контуру фигуры.

Огромная подсказка, что что-то не так, это list<Figure> m_vertices;. Очень редко, что класс концептуально содержит экземпляры самого себя. И обычно, когда вы это делаете, вы создаете свою собственную структуру данных, такую ​​как дерево или список, а затем класс содержит указатели на экземпляры самого себя.

Кроме того, тот факт, что простое исправление @ dark_charlie привело к бесконечной рекурсии, - еще одна огромная подсказка, что что-то не так.

Я предполагаю, что это домашнее задание, так что это вся помощь, которую я вам отдам, чтобы сообщить вам, что, по-моему, у вас уже есть класс Point, который вы называете Vertex.

+0

ха-ха, да, это домашняя работа, и спасибо вам, чтобы попробовать сейчас – Makenshi

+0

+1 для сужения этого вниз :) –

+0

нормально спасибо, я думаю, что это лучший LOL – Makenshi

2

Вы не можете вызвать конструктор непосредственно так, как вы пытаетесь. Создайте функцию набора(), которая будет делать ту же работу, и использовать его вместо конструктора:

class Figure { 
    // ... 
public: 
    void set(float x, float y, float z); 
    // ... 
}; 

void Figure::set(float x, float y, float z) 
{ 
    // Your original code from the constructor 
    this->x1 = x; 
    this->y1 = y; 
    this->z1 = z; 
    // m_vertices.push_back(Figure(x1, y1, z1)); 
} 

Figure::Figure(float x, float y, float z) 
{ 
    // In the constructor call the newly created set function 
    set(x, y, z); 
} 


// Replace the faulty line with this: 
DrawFig->set(vlist[j]->x, vlist[j]->y, vlist[j]->z); 

EDIT:

Как было отмечено в комментариях, код имеет еще один недостаток - у вас есть список цифр, которые содержатся в самой фигуре. Я думаю, что вы имели в виду объявить m_vertices следующим образом:

list <Vertex> m_vertices; 

Затем, однако, если вы хотите, чтобы рисунок на треугольник (или любой другой более высокий порядок многоугольник), вам нужно будет пройти координаты всех трех вершин вместо трех координат одной вершины:

void Figure::set(const Vertex& v1, const Vertex& v2, const Vertex& v3) 
{ 
    m_vertices.push_back(v1); 
    m_vertices.push_back(v2); 
    m_vertices.push_back(v3); 

    // The position of the figure will be its centroid 
    this->x1 = (v1.x + v2.x + v3.x)/3; 
    this->y1 = (v1.y + v2.y + v3.y)/3; 
    this->z1 = (v1.z + v2.z + v3.z)/3; 
} 

Figure::Figure(const Vertex& v1, const Vertex& v2, const Vertex& v3) 
{ 
    set(v1, v2, v3); 
} 

Вам также нужно настроить цикл читать 3 вершины сразу, а не только один, но я дам, что до вас :)

+0

Вы можете. :) См. Мой ответ. – Albert

+1

Это приводит к бесконечной рекурсии, и это не правильный ответ. Ваш метод 'set' заканчивается вызовом конструктора для создания нового элемента списка, который вызывает' set', который заканчивается вызовом конструктора ... и т. Д. Это не только бесконечно рекурсивно, но и вы будете использовать всю кучу если вы можете с новыми узлами списка. – Omnifarious

+0

@Omnifarious Спасибо за то, что заметили это, я полностью забыл об этом. Отредактировал сообщение, чтобы его охватить. –

1

несколько вещей:

  • Вы создали экземпляр класса Figure?
  • Является ли экземпляр list <Figure> m_vertices;?

Использование использования таНоса Функции C с исполняемым кодом C++ грязен, лучше придерживаться нового вместо держать выполнение C++ последовательны.

+0

hmm как вы создаете экземпляр списка? – Makenshi

+0

m_vertices, если я прочитал это правильно, не инициализирован нет? Я думал, что будет строка типа «m_vertices = новый список

(); нет? – t0mm13b

+1

+1 для упоминания использования malloc в коде C++ –

2

Просто о прямом вызове конструктора:

Используйте вместо этого:

// destruct and reconstruct 
DrawFig -> ~Figure(); 
new (DrawFig) Figure(vlist[j]->x, vlist[j]->y, vlist[j]->z); 

Что он делает:

  1. Это вызывает деструктор.

    Деструктор сам вызовет деструктор всех переменных-членов. float s не нужен/имеет деструктор, но std::list имеет. std::list s destructor освободит все содержащиеся объекты.

  2. Он называет конструктор.

    Сам конструктор вызовет конструктор всех переменных-членов. Опять же, float s не имеют этого, и они не инициализируются определенным образом, то есть они снова игнорируются. Затем вызывается конструктор std::list, который инициализирует list.

Однако использование решения dark_charlie может быть более чистым.


Не только решение DCs более чистое, но и другое. Вызвав конструктор снова, вы также сбросите Figure::m_vertices, и я думаю, что это, вероятно, не то, что вы хотите здесь.

Однако, возможно, вместо set (как в решении DCs) вы должны называть его add или так.

Кроме того, я не уверен, что если вы действительно хотите иметь Figure или Figure::m_vertices таким образом (каждый Figure, содержащий список к другим Figure с).

+1

Я бы не научил новичку такой подход. Да, это действительно так, но я бы не хотел читать код несколько месяцев или лет спустя :) –

+0

Я стесняюсь дать вам +1, потому что это печально и уродливо и сильно запутает нового программиста. OTOH, обучение именно тому, что здесь происходит, будет очень поучительным для указанного программиста, следовательно, +1. – Omnifarious

+0

Оба ответа разрешили проблему ... но теперь ее ничего не рисовать XD – Makenshi

Смежные вопросы